ListViewはFlutterで最もよく使うWidgetだと思う。
FlutterのサンプルでもListView+ListTileの記事はよくあるけど、
APIなど外部のサーバーから取得したJSONなりのデータを
リスト表示する方法を書き溜めておく。
注意点として、状態管理にはsetStateを利用しています。
blocやproviderとかでもいいと思うんだけど
今回は簡単に実装できるsetStateでのListViewです。
概要
ListView.builderとListTileを使ってリストで表示する手順
サーバーと通信するデータ取得用の非同期関数を作る
まず、APIからのデータを格納するためのitemList変数を宣言します。
その後、例としてbuildItemsという、文字列リストを作る非同期関数を作成します。
| 
					 1 2 3 4 5 6 7 8 9  | 
						  List<String> itemList = [];   void buildItemList()async{     var response = await fetchItems();     for (int j = 0; j < response.data["items"].length; j++) {       setState(() {         itemList.add(response.data["items"][j]);       });      }   }  | 
					
fetchItems();は、実際にAPIサーバと通信し、
データを取得する関数です。
これについてはDioを使うのがいいです。
実装については、前に書いた記事をよんでね。
Dioは、ぱぱっと使えるのでよい。
headersへの設定も簡単でJWT(JSON Web Token)を使った認証もらくらくできます。
initStateにデータ取得用関数を記述する
先程の関数はページを初期化する際のinitState内に記述します。
buildItemList()を読んでデータ取得を開始します。
| 
					 1 2 3 4 5  | 
						  @override   void initState() {     buildItemList();     super.initState();   }  | 
					
super.initStateの前に書いたほうがいいはず。
Scaffold内にListView.builderで描画する
先程、initStateでitemListにデータが非同期に追加されていくため、
最初は、0個のitemListは「Loading..」が表示される。
initStateでデータ取得後、itemListの状態がsetStateが呼ばれたことで更新されると、
ListView.builder内のitemBuilderが走りいい感じのTileListがリストで表示される。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  | 
						  @override   Widget build(BuildContext context) {     return Scaffold(       appBar: AppBar(         title: Text("Flutter ListView.builderのサンプル"),       ),       body: Center(         child: (itemList == null || itemList.length == 0)?           Text("Loading....") :           ListView.builder(             itemBuilder: (BuildContext context, int index) {               return ListTile(                  title: Text("${itemList[index]}"),               )             },             itemCount: itemList.length           )       ),       floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,       floatingActionButton: FloatingActionButton(           backgroundColor: Colors.red,           onPressed: (){             print("pressed");           },           child: new Icon(             Icons.cloud_upload,             color: Colors.white,           ),         )     );   }  | 
					
いやー。
簡単だね。ListTile以外にもCard Widget使ったり
応用できる部分は多々あるので使ってみてね。
じゃあね〜〜〜〜。
