詳解Flutter中l(wèi)istview的高級(jí)用法
簡(jiǎn)介
一般情況下,我們使用Listview的方式是構(gòu)建要展示的item,然后將這些item傳入ListView的構(gòu)造函數(shù)即可,通常情況下這樣做是夠用了,但是不排除我們會(huì)有一些其他的特殊需求。
今天我們會(huì)來(lái)講解一下ListView的一些高級(jí)用法。
ListView的常規(guī)用法
ListView的常規(guī)用法就是直接使用ListView的構(gòu)造函數(shù)來(lái)構(gòu)造ListView中的各個(gè)item。
其中ListView有一個(gè)children屬性,它接收一個(gè)widget的list,這個(gè)list就是ListView中要呈現(xiàn)的對(duì)象。
我們來(lái)構(gòu)造一個(gè)擁有100個(gè)item的ListView對(duì)象:
class CommonListViewApp extends StatelessWidget{ const CommonListViewApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return ListView( children: List<Widget>.generate(100, (i) => Text('列表 $i')), ); } }
上面的例子中,我們簡(jiǎn)單的使用List.generate方法生成了100個(gè)對(duì)象。
在item數(shù)目比較少的情況下是沒(méi)有任何問(wèn)題的,如果item數(shù)目比較多的情況下,直接將所有的item都取出來(lái)放在ListView中就不太現(xiàn)實(shí)了。
幸好,ListView還提供了一個(gè)ListView.builder的方法,這個(gè)方法會(huì)按需進(jìn)行item的創(chuàng)建,所以在item數(shù)目比較多的情況下是非常好用的。
還是上面的例子,這次我們要生成10000個(gè)item對(duì)象,然后將這些對(duì)象放在ListView中去,應(yīng)該如何處理呢?
因?yàn)檫@次我們要使用builder,所以沒(méi)有必要在item生成的時(shí)候就創(chuàng)建好widget,我們可以將widget的創(chuàng)建放在ListView的builder中。
首先,我們構(gòu)建一個(gè)items list,并將其傳入MyApp的StatelessWidget中:
MyApp( items: List<String>.generate(10000, (i) => '列表 $i'), )
然后就可以在MyApp的body中使用ListView.builder來(lái)構(gòu)建item了:
body: ListView.builder( itemCount: items.length, prototypeItem: ListTile( title: Text(items.first), ), itemBuilder: (context, index) { return ListTile( title: Text(items[index]), ); }, )
ListView.builder是推薦用來(lái)創(chuàng)建ListView的方式,上面的完整代碼如下:
import 'package:flutter/material.dart'; void main() { runApp( MyApp( items: List<String>.generate(10000, (i) => '列表 $i'), ), ); } class MyApp extends StatelessWidget { final List<String> items; const MyApp({Key? key, required this.items}) : super(key: key); @override Widget build(BuildContext context) { const title = 'ListView的使用'; return MaterialApp( title: title, home: Scaffold( appBar: AppBar( title: const Text(title), ), body: ListView.builder( itemCount: items.length, prototypeItem: ListTile( title: Text(items.first), ), itemBuilder: (context, index) { return ListTile( title: Text(items[index]), ); }, ), ), ); } }
創(chuàng)建不同類(lèi)型的items
看到這里,可能有同學(xué)會(huì)問(wèn)了,ListView中是不是只能創(chuàng)建一種item類(lèi)型呢?答案當(dāng)然是否定的。
不管是從ListView的構(gòu)造函數(shù)構(gòu)建還是從ListView.builder構(gòu)建,我們都可以自由的創(chuàng)建不同類(lèi)型的item。
當(dāng)然最好的辦法就是使用ListView.builder,根據(jù)傳入的index的不同來(lái)創(chuàng)建不同的item。
還是上面的例子,我們可以在創(chuàng)建items數(shù)組的時(shí)候就根據(jù)i的不同來(lái)生成不同的item類(lèi)型,也可以如下所示,在itemBuilder中根據(jù)index的不同來(lái)返回不同的item:
body: ListView.builder( itemCount: items.length, prototypeItem: ListTile( title: Text(items.first), ), itemBuilder: (context, index) { if(index %2 == 0) { return ListTile( title: Text(items[index]), ); }else{ return Text(items[index]); } }, )
非常的方便。
創(chuàng)建不同item的完整代碼如下:
import 'package:flutter/material.dart'; void main() { runApp( MyApp( items: List<String>.generate(10000, (i) => '列表 $i'), ), ); } class MyApp extends StatelessWidget { final List<String> items; const MyApp({Key? key, required this.items}) : super(key: key); @override Widget build(BuildContext context) { const title = 'ListView的使用'; return MaterialApp( title: title, home: Scaffold( appBar: AppBar( title: const Text(title), ), body: ListView.builder( itemCount: items.length, prototypeItem: ListTile( title: Text(items.first), ), itemBuilder: (context, index) { if(index %2 == 0) { return ListTile( title: Text(items[index]), ); }else{ return Text(items[index]); } }, ), ), ); } }
總結(jié)
ListView是我們?cè)趹?yīng)用中會(huì)經(jīng)常用到的一種widget,希望大家能夠靈活掌握。
本文的例子:https://github.com/ddean2009/learn-flutter.git
到此這篇關(guān)于詳解Flutter中l(wèi)istview的高級(jí)用法的文章就介紹到這了,更多相關(guān)Flutter listview內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android啟動(dòng)頁(yè)設(shè)置及動(dòng)態(tài)權(quán)限跳轉(zhuǎn)問(wèn)題解決
在我遇到這個(gè)實(shí)際問(wèn)題之前,我一直認(rèn)為啟動(dòng)頁(yè)的作用是美化產(chǎn)品,提升軟件逼格。但實(shí)際上,它更重要的是起到了一個(gè)攔截器的作用,這篇文章主要介紹了Android啟動(dòng)頁(yè)設(shè)置以及動(dòng)態(tài)權(quán)限跳轉(zhuǎn),需要的朋友可以參考下2022-04-04Android UI控件之Gallery實(shí)現(xiàn)拖動(dòng)式圖片瀏覽效果
這篇文章主要為大家詳細(xì)介紹了Android UI控件之Gallery實(shí)現(xiàn)拖動(dòng)式圖片瀏覽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android RollPagerView實(shí)現(xiàn)輪播圖
這篇文章主要介紹了Android RollPagerView實(shí)現(xiàn)輪播圖的相關(guān)資料,這里提供實(shí)例來(lái)實(shí)現(xiàn)輪播圖的簡(jiǎn)單實(shí)例,希望能幫助到大家,需要的朋友可以參考下2017-08-08一個(gè)Activity中多個(gè)Fragment實(shí)現(xiàn)沉浸式狀態(tài)欄的解決方法
這篇文章主要介紹了一個(gè)Activity中多個(gè)Fragment實(shí)現(xiàn)沉浸式狀態(tài)欄解決方法,對(duì)于解決這個(gè)問(wèn)題要分為兩部分,具體內(nèi)容詳情,大家參考下本文吧2017-01-01Android 動(dòng)態(tài)菜單實(shí)現(xiàn)實(shí)例代碼
這篇文章主要介紹了Android 動(dòng)態(tài)菜單實(shí)現(xiàn)實(shí)例代碼的相關(guān)資料,這里附有實(shí)例代碼及實(shí)現(xiàn)效果圖,需要的朋友可以參考下2017-01-01Android AIDL和遠(yuǎn)程Service調(diào)用示例代碼
本文主要介紹Android AIDL和遠(yuǎn)程Service,這里詳細(xì)介紹了相關(guān)知識(shí),并附實(shí)例代碼和實(shí)現(xiàn)效果圖,有興趣的朋友參考下2016-08-08Android AIDL實(shí)現(xiàn)進(jìn)程間通信探索
這篇文章主要為大家詳細(xì)介紹了Android AIDL實(shí)現(xiàn)進(jìn)程間通信的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09