成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Flutter:一小時從零構建一個簡單的 App,以及你如何做到這一點!

企業動態
這是一個偶然的事件,我正在瀏覽我的 Youtube 的訂閱內容,看到了很多關于 Flutter 的相關視頻,這引起了我的興趣。我很興奮的開始閱讀它的文檔。

[[221817]]

概要

這是一個偶然的事件,我正在瀏覽我的 Youtube 的訂閱內容,看到了很多關于 Flutter 的相關視頻,這引起了我的興趣。我很興奮的開始閱讀它的文檔。

我喜歡的學習方式,是邊動手邊學習。閱讀完幾頁文檔并研究如何創建一個新的項目,我對自己嘗試新東西,倍感信心。

如你在 Gif 中看到的那樣,這是一個非常基本的應用程序,但它仍然有一些讓我覺得有趣的地方。

它使用 Google Book Api 從數據庫中讀取書籍數據。

在數據展示前,顯示一個加載指示器。

將書名和圖像,都加載顯示出來。

在傳統的 Android App 中,這將需要幾個類和不少代碼。

而使用 Flutter,這個 App 有一個類和 129 行代碼。包括一些引入語句和布局。

這一切,是不是聽起來很棒?讓我們開始吧!

開始

在我開始之前,我并不會詳細的介紹這個 App 的所有細節,請務必查看示例代碼以及文檔,進行參考。

另外,整個 App 的代碼(所有 129 行代碼),都在 Github 上開源,我推薦你看看。

https://github.com/Norbert515/BookSearch

  1. List<Book> _items = new List(); 
  2. final subject = new PublishSubject<String>(); 
  3. bool _isLoading = false

在這個例子中,我們需要 3 個變量。

一個書本的列表,其中一般被定義成長這樣:

  1. class Book {  
  2.   String title,url;  
  3.   Book(this.title,this.url);  

一個 Public Subject,它是 RxDart 的一部分,而 RxDart 又是 Rx 的一個實現,我這里主要用它來監聽 textChanged 事件。

還有一個變量,表示我們目前是否在等待服務端響應。

此外,用戶界面包含三個主要元素。

  • 列表
  • 加載器。
  • 文本輸入框。

我們將他們放在一起。

  1. new TextField( 
  2.     decoration: new InputDecoration( 
  3.     hintText: 'Choose a book'
  4.     ), 
  5.     onChanged: (string) => (subject.add(string)), 
  6. ), 

關于這個地方的一個有趣的部分是 onChanged,在這里我們傳遞了一個 Lambda,它講當前輸入的文本添加到 subject 上,這使得我們可以在其他地方監聽回調。

  1. _isLoading? new CircularProgressIndicator(): new Container(), 

如果當前出于加載狀態,則顯示進度條,否則顯示一個空的容器。

  1. new Expanded( 
  2.   child: new ListView.builder( 
  3.     padding: new EdgeInsets.all(8.0), 
  4.     itemCount: _items.length, 
  5.     itemBuilder: (BuildContext context, int index) { 
  6.       return new Card( 
  7.         child: new Padding( 
  8.             padding: new EdgeInsets.all(8.0), 
  9.             child: new Row( 
  10.               children: <Widget>[ 
  11.                 _items[index].url != null? new Image.network(_items[index].url): new Container(), 
  12.                 new Flexible( 
  13.                     child: new Text(_items[index].title, maxLines: 10), 
  14.                 ), 
  15.               ], 
  16.             ) 
  17.         ) 
  18.       ); 
  19.     }, 
  20.   ), 
  21. ), 

該列表是一個基于索引的 ListView。而在其內部,我們布局了一個用于顯示網絡圖片的 Image 以及一個用于顯示書籍描述的 Text。

邏輯代碼

  1. @override 
  2.   void initState() { 
  3.     super.initState(); 
  4.     subject.stream.debounce(new Duration(milliseconds: 600)).listen(_textChanged); 
  5.   } 

在這個 initState 方法中,我們使用流式編碼來處理它的事件并消費它們。這樣做是為了每次點鍵入文本的時候,不會立即向 Api 服務器發送請求,而是會在***一次鍵入文本之后,等待 600ms,再將輸入的字符串發送到 _textChange() 方法,這也是我們使用 Rx  的唯一原因。

  1. void _textChanged(String text) { 
  2.     if(text.isEmpty) { 
  3.       setState((){_isLoading = false;}); 
  4.       _clearList(); 
  5.       return
  6.     } 
  7.     setState((){_isLoading = true;}); 
  8.     _clearList(); 
  9.     http.get("https://www.googleapis.com/books/v1/volumes?q=$text"
  10.         .then((response) => response.body) 
  11.         .then(JSON.decode) 
  12.         .then((map) => map["items"]) 
  13.         .then((list) {list.forEach(_addBook);}) 
  14.         .catchError(_onError) 
  15.         .then((e){setState((){_isLoading = false;});}); 
  16.   } 
  17.  
  18.   void _onError(dynamic d) { 
  19.     setState(() { 
  20.       _isLoading = false
  21.     }); 
  22.   } 
  23.  
  24.   void _clearList() { 
  25.     setState(() { 
  26.       _items.clear(); 
  27.     }); 
  28.   } 

所有的邏輯都在這里了。

首先說幾點,如果 Text 是空的,我們不再加載并消除列表。

另外,如果我們獲取到 Text 的內容,我們將開始加載并清除列表。

之后,我們向 Google Api 發出請求 volumes?q=$text ,其中 text 包含當前輸入的字符串。

當結果返回的時候:

  • 獲得返回的內容。
  • 解析 JSON 數據,飯后返回一個 Map。
  • "items" 包含大量的書籍信息。
  • 循環迭代之后,使用 _addBook() 方法添加到 "items" 中。
  • 這些 "items" 就是我們需要的標題和書籍封面圖。
  1. void _addBook(dynamic book) { 
  2.     setState(() { 
  3.       _items.add(new Book(book["volumeInfo"]["title"], book["volumeInfo"]["imageLinks"]["smallThumbnail"])); 
  4.     }); 
  5.   } 

小結

到這里,該 App 是一個完整的小應用。

這是***步,接下來將使用一個數據庫來存儲數據。

【本文為51CTO專欄作者“張旸”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2019-11-15 14:11:41

工業革命工業4.0信息化

2021-09-17 08:04:28

Hooks函數組件架構

2021-03-25 09:42:37

CIO首席信息官IT領導

2023-05-08 00:01:29

數據分析指標標簽

2016-09-14 17:48:44

2022-03-18 14:11:05

安全事件安全分析威脅

2015-04-02 11:17:20

2017-08-08 15:55:31

戴爾

2021-04-29 22:11:28

Python排序算法

2019-07-10 06:08:33

IT運維網絡故障故障排除

2024-12-23 11:41:45

2014-09-25 09:51:29

Android App個人博客

2017-04-05 11:32:36

環保戴爾地球一小時

2018-09-17 12:42:34

2013-03-21 15:20:14

搜狗

2018-10-15 21:12:08

2018-03-19 10:30:17

程序員永久斷網

2013-08-09 09:41:04

2013-06-04 13:43:53

2020-08-29 18:51:14

效能工具效率生產力
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品中文字幕 | 国产精品永久 | 一级片片 | 精品久久香蕉国产线看观看亚洲 | 亚洲激情第一页 | 亚洲欧美aⅴ | 欧美黑人一区 | 欧美日韩一区二区三区不卡视频 | 在线视频a | 精品久久久久久久 | 国产精品一区二区三区在线 | av性色| 亚洲精品区 | 国产一区二区在线播放视频 | 久久亚洲二区 | 金莲网| a免费视频 | 亚洲一区二区精品视频 | 91精品国产91久久久久久不卞 | 亚洲三级在线观看 | 欧美日韩中文字幕 | 久久久久久久一区 | 国产精品毛片一区二区三区 | 波多野结衣二区 | aaa天堂 | 亚洲一区二区在线播放 | 中文字幕精品一区二区三区精品 | 91性高湖久久久久久久久_久久99 | 精品久久久网站 | 狠狠干天天干 | 久久久91| 久久伊人久久 | 人人射人人 | 在线日韩| 久久免费观看视频 | 91精品久久 | 波多野结衣中文视频 | 99热这里都是精品 | 日韩视频在线观看中文字幕 | 欧美色性 | 成人在线免费观看视频 |