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

Flutter:一小時(shí)從零構(gòu)建一個(gè)簡單的 App,以及你如何做到這一點(diǎn)!

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

[[221817]]

概要

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

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

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

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

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

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

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

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

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

開始

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

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

https://github.com/Norbert515/BookSearch

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

在這個(gè)例子中,我們需要 3 個(gè)變量。

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

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

一個(gè) Public Subject,它是 RxDart 的一部分,而 RxDart 又是 Rx 的一個(gè)實(shí)現(xiàn),我這里主要用它來監(jiān)聽 textChanged 事件。

還有一個(gè)變量,表示我們目前是否在等待服務(wù)端響應(yīng)。

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

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

我們將他們放在一起。

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

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

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

如果當(dāng)前出于加載狀態(tài),則顯示進(jìn)度條,否則顯示一個(gè)空的容器。

  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. ), 

該列表是一個(gè)基于索引的 ListView。而在其內(nèi)部,我們布局了一個(gè)用于顯示網(wǎng)絡(luò)圖片的 Image 以及一個(gè)用于顯示書籍描述的 Text。

邏輯代碼

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

在這個(gè) initState 方法中,我們使用流式編碼來處理它的事件并消費(fèi)它們。這樣做是為了每次點(diǎn)鍵入文本的時(shí)候,不會(huì)立即向 Api 服務(wù)器發(fā)送請求,而是會(huì)在***一次鍵入文本之后,等待 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.   } 

所有的邏輯都在這里了。

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

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

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

當(dāng)結(jié)果返回的時(shí)候:

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

小結(jié)

到這里,該 App 是一個(gè)完整的小應(yīng)用。

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

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

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

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2019-11-15 14:11:41

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

2021-09-17 08:04:28

Hooks函數(shù)組件架構(gòu)

2021-03-25 09:42:37

CIO首席信息官IT領(lǐng)導(dǎo)

2023-05-08 00:01:29

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

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運(yùn)維網(wǎng)絡(luò)故障故障排除

2024-12-23 11:41:45

2017-04-05 11:32:36

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

2018-09-17 12:42:34

2014-09-25 09:51:29

Android App個(gè)人博客

2013-03-21 15:20:14

搜狗

2018-10-15 21:12:08

2013-06-04 13:43:53

2018-03-19 10:30:17

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

2013-08-09 09:41:04

2020-08-29 18:51:14

效能工具效率生產(chǎn)力
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产色在线 | 女朋友的闺蜜3韩国三级 | 国产一区二区三区免费观看在线 | 国产在线网址 | 欧美精品一二区 | 亚洲高清免费观看 | 亚洲精品一区中文字幕乱码 | 国产精品久久久久久久一区探花 | 激情小说综合网 | 最新中文字幕 | 日韩一区二区精品 | 自拍偷拍精品 | 黄色一级大片在线免费看产 | 中文字幕在线三区 | 做a视频在线观看 | 人人爱干| 免费看黄视频网站 | 日韩网站在线 | 欧美激情亚洲激情 | 国产a级黄色录像 | 国产午夜在线观看 | 69av网| 国产成人精品一区二区三区 | 精品国产欧美一区二区三区不卡 | 国产精品久久久久久久久图文区 | 成人二区 | 国产色网站 | 精品久久久久久久 | 日韩在线电影 | 亚洲精品成人网 | 国产在线精品一区二区 | 欧美亚洲视频在线观看 | 国产激情偷乱视频一区二区三区 | 黄色成人av | 综合亚洲视频 | 午夜一区 | 草b视频 | 在线亚洲精品 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 美女精品一区 | 欧美日韩成人网 |