自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[221817]]

概要

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

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

如你在 Gif 中看到的那樣,這是一個非?;镜膽贸绦颍匀挥幸恍┳屛矣X得有趣的地方。

它使用 Google Book Api 從數(shù)據(jù)庫中讀取書籍數(shù)據(jù)。

在數(shù)據(jù)展示前,顯示一個加載指示器。

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

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

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

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

開始

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

另外,整個 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 的一個實現(xiàn),我這里主要用它來監(jiān)聽 textChanged 事件。

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

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

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

我們將他們放在一起。

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

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

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

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

  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。而在其內部,我們布局了一個用于顯示網(wǎng)絡圖片的 Image 以及一個用于顯示書籍描述的 Text。

邏輯代碼

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

在這個 initState 方法中,我們使用流式編碼來處理它的事件并消費它們。這樣做是為了每次點鍵入文本的時候,不會立即向 Api 服務器發(fā)送請求,而是會在***一次鍵入文本之后,等待 600ms,再將輸入的字符串發(fā)送到 _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 發(fā)出請求 volumes?q=$text ,其中 text 包含當前輸入的字符串。

當結果返回的時候:

  • 獲得返回的內容。
  • 解析 JSON 數(shù)據(jù),飯后返回一個 Map。
  • "items" 包含大量的書籍信息。
  • 循環(huán)迭代之后,使用 _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 是一個完整的小應用。

這是***步,接下來將使用一個數(shù)據(jù)庫來存儲數(shù)據(jù)。

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

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

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

2019-11-15 14:11:41

工業(yè)革命工業(yè)4.0信息化

2021-09-17 08:04:28

Hooks函數(shù)組件架構

2021-03-25 09:42:37

CIO首席信息官IT領導

2022-03-18 14:11:05

安全事件安全分析威脅

2016-09-14 17:48:44

2023-05-08 00:01:29

數(shù)據(jù)分析指標標簽

2024-12-23 11:41:45

2015-04-02 11:17:20

2017-08-08 15:55:31

戴爾

2017-04-05 11:32:36

環(huán)保戴爾地球一小時

2018-09-17 12:42:34

2021-04-29 22:11:28

Python排序算法

2019-07-10 06:08:33

IT運維網(wǎng)絡故障故障排除

2013-03-21 15:20:14

搜狗

2013-06-04 13:43:53

2014-09-25 09:51:29

Android App個人博客

2020-08-29 18:51:14

效能工具效率生產力

2018-03-19 10:30:17

程序員永久斷網(wǎng)

2013-08-09 09:41:04

2021-06-26 07:15:25

網(wǎng)絡攻擊容器漏洞
點贊
收藏

51CTO技術棧公眾號