简介
个别状况下,咱们应用Listview的形式是构建要展现的item,而后将这些item传入ListView的构造函数即可,通常状况下这样做是够用了,然而不排除咱们会有一些其余的非凡需要。
明天咱们会来解说一下ListView的一些高级用法。
ListView的惯例用法
ListView的惯例用法就是间接应用ListView的构造函数来结构ListView中的各个item。
其中ListView有一个children属性,它接管一个widget的list,这个list就是ListView中要出现的对象。
咱们来结构一个领有100个item的ListView对象:
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')), ); }}
下面的例子中,咱们简略的应用List.generate办法生成了100个对象。
在item数目比拟少的状况下是没有任何问题的,如果item数目比拟多的状况下,间接将所有的item都取出来放在ListView中就不太事实了。
幸好,ListView还提供了一个ListView.builder的办法,这个办法会按需进行item的创立,所以在item数目比拟多的状况下是十分好用的。
还是下面的例子,这次咱们要生成10000个item对象,而后将这些对象放在ListView中去,应该如何解决呢?
因为这次咱们要应用builder,所以没有必要在item生成的时候就创立好widget,咱们能够将widget的创立放在ListView的builder中。
首先,咱们构建一个items list,并将其传入MyApp的StatelessWidget中:
MyApp( items: List<String>.generate(10000, (i) => '列表 $i'), )
而后就能够在MyApp的body中应用ListView.builder来构建item了:
body: ListView.builder( itemCount: items.length, prototypeItem: ListTile( title: Text(items.first), ), itemBuilder: (context, index) { return ListTile( title: Text(items[index]), ); }, )
ListView.builder是举荐用来创立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]), ); }, ), ), ); }}
创立不同类型的items
看到这里,可能有同学会问了,ListView中是不是只能创立一种item类型呢?答案当然是否定的。
不论是从ListView的构造函数构建还是从ListView.builder构建,咱们都能够自在的创立不同类型的item。
当然最好的方法就是应用ListView.builder,依据传入的index的不同来创立不同的item。
还是下面的例子,咱们能够在创立items数组的时候就依据i的不同来生成不同的item类型,也能够如下所示,在itemBuilder中依据index的不同来返回不同的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]); } }, )
十分的不便。
创立不同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]); } }, ), ), ); }}
总结
ListView是咱们在利用中会常常用到的一种widget,心愿大家可能灵便把握。
本文的例子:https://github.com/ddean2009/learn-flutter.git