FLutter ListView 列表组件

关键字 :Flutter APP

FLutter ListView 列表组件

ListView是最常用的可滚动组件之一,它可以沿一个方向线性排布所有子组件,并且它也支持基于 Sliver 的延迟构建模型。

默认构造函数

ListView({
...  
 //可滚动 widget 公共参数
 Axis scrollDirection = Axis.vertical,
 bool reverse = false,
 ScrollController controller,
 bool primary,
 ScrollPhysics physics,
 EdgeInsetsGeometry padding,

 //ListView 各个构造函数的共同参数  
 double itemExtent,
 bool shrinkWrap = false,
 bool addAutomaticKeepAlives = true,
 bool addRepaintBoundaries = true,
 double cacheExtent,

 //子 widget 列表
 List<Widget> children = const <Widget>[],
})


上面参数分为两组:第一组是可滚动组件的公共参数,本章第一节中已经介绍过,不再赘述;第二组是ListView各个构造函数(ListView有多个构造函数)的共同参数,我们重点来看看这些参数:

  • itemExtent :该参数如果不为 null ,则会强制 children 的“⻓度”为 itemExtent 的值;这里的 “⻓度”是指滚动方向上子组件的⻓度,也就是说如果滚动方向是垂直方向,则 itemExtent 代表子 组件的高度;如果滚动方向为水平方向,则 itemExtent 就代表子组件的宽度。在 ListView 中, 指定 itemExtent 比让子组件自己决定自身⻓度会更高效,这是因为指定 itemExtent 后,滚动系 统可以提前知道列表的⻓度,而无需每次构建子组件时都去再计算一下,尤其是在滚动位置频繁变 化时(滚动系统需要频繁去计算列表高度)。
  • shrinkWrap :该属性表示是否根据子组件的总⻓度来设置 ListView 的⻓度,默认值为 false 。默认情况下, ListView 的会在滚动方向尽可能多的占用空间。当 ListView 在一个无边界(滚动 方向上)的容器中时, shrinkWrap 必须为 true 。
  • addAutomaticKeepAlives :该属性表示是否将列表项(子组件)包裹在 AutomaticKeepAlive 组件中;典型地,在一个懒加载列表中,如果将列表项包裹在 AutomaticKeepAlive 中,在该列 表项滑出视口时它也不会被 GC(垃圾回收),它会使用 KeepAliveNotification 来保存其状态。如果列表项自己维护其 KeepAlive 状态,那么此参数必须置为 false 。
  • addRepaintBoundaries :该属性表示是否将列表项(子组件)包裹在 RepaintBoundary 组件中。当可滚动组件滚动时,将列表项包裹在 RepaintBoundary 中可以避免列表项重绘,但是当列 表项重绘的开销非常小(如一个颜色块,或者一个较短的文本)时,不添加 RepaintBoundary 反 而会更高效。和 addAutomaticKeepAlive 一样,如果列表项自己维护其 KeepAlive 状态,那么 此参数必须置为 false 。

最简单使用方式

数据少时使用, 数据在 children 里面

ListView(
 shrinkWrap: true,
 padding: const EdgeInsets.all(20.0),
 children: <Widget>[
   const Text('I\'m dedicating every day to you'),
   const Text('Domestic life was never quite my style'),
   const Text('When you smile, you knock me out, I fall apart'),
   const Text('And I thought I was so smart'),
],
);


ListView.builder

ListView.builder适合列表项比较多(或者无限)的情况,因为只有当子组件真正显示的时候才会被创建,也就说通过该构造函数创建的ListView是支持基于 Sliver 的懒加载模型的。

ListView.builder(
   itemCount: 100,
   itemExtent: 50.0, //强制高度为50.0
   itemBuilder: (BuildContext context, int index) {

     return ListTile(title: Text("$index"));
  }
);
  • itemBuilder:它是列表项的构建器,类型为IndexedWidgetBuilder,返回值为一个 widget。当列表滚动到具体的index位置时,会调用该构建器构建列表项。

  • itemCount:列表项的数量,如果为null,则为无限列表。

ListView.separated

ListView.separated可以在生成的列表项之间添加一个分割组件,它比ListView.builder多了一个separatorBuilder参数,该参数是一个分割组件生成器。

class ListView3 extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
   //下划线widget预定义以供复用。  
   Widget divider1=Divider(color: Colors.blue,);
   Widget divider2=Divider(color: Colors.green);
   return ListView.separated(
       itemCount: 100,
       //列表项构造器
       itemBuilder: (BuildContext context, int index) {
         return ListTile(title: Text("$index"));
      },
       //分割器构造器
       separatorBuilder: (BuildContext context, int index) {
         return index%2==0?divider1:divider2;
      },
  );
}
}

添加固定列表头

@override
Widget build(BuildContext context) {
 return Column(children: <Widget>[
   ListTile(title:Text("商品列表")),
   Expanded(
     child: ListView.builder(itemBuilder: (BuildContext context, int index) {
       return ListTile(title: Text("$index"));
    }),
  ),
]);
}

总结

介绍了ListView的一些公共参数以及常用的构造函数。不同的构造函数对应了不同的列表项生成模型,如果需要自定义列表项生成模型,可以通过ListView.custom来自定义,它需要实现一个SliverChildDelegate用来给 ListView 生成列表项组件,更多详情请参考API 文档。

参考资料

Flutter 实战 (https://book.flutterchina.club/)

 

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论