简介

个别状况下,咱们应用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