Flutter学习 滚动组件(1):ListView基本利用

打印 上一主题 下一主题

主题 1613|帖子 1613|积分 4839

一、ListView构造方法

主要以下几种方法:


  • 通例方法,直接利用默认的构造方法
  • ListView.builder
  • ListView.separated
1.1 通例方法

ListView的通例方法:就是利用默认方法构造各个item,ListView有个children属性:传入多个widget:
  1. import 'package:flutter/material.dart';
  2. main(List<String> args) {
  3.   runApp(const MyApp());
  4. }
  5. class MyApp extends StatelessWidget {
  6.   // This widget is the root of your application.
  7.   @override
  8.   Widget build(BuildContext context) {
  9.     const title = 'ListView的使用';
  10.     return MaterialApp(
  11.       debugShowCheckedModeBanner: false,
  12.       title: title,
  13.       theme: ThemeData(
  14.         colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
  15.         useMaterial3: true,
  16.       ),
  17.       home: Scaffold(
  18.           appBar: AppBar(
  19.             title: const Text(title),
  20.           ),
  21.           body:
  22.           MyHomeBody(),
  23.     );
  24.   }
  25. }
  26. class MyHomeBody extends StatelessWidget {
  27.   const MyHomeBody({super.key});
  28.   final TextStyle textStyle = const TextStyle(fontSize: 10, color: Colors.blue);
  29.   @override
  30.   Widget build(BuildContext context) {
  31.     return  ListView(
  32.       children: List<Widget>.generate(100, (i) => Text('列表 $i')),
  33.     );
  34.   }
  35. }
复制代码
运行结果图如下:

1.2 ListView.builder

List<Widget>.generate 会默认把全部子item全部创建出来,假如子item数量过多时,会影响页面的渲染时间,ListView.builder不会把全部子item创建出来,会在真正需要的时间构建出来,不会一开始全部初始化出来,适合数量许多item的场景:
  1. void main() {
  2.   runApp(
  3.     MyApp(
  4.       items: List<String>.generate(10000, (i) => '列表 $i'),
  5.     ),
  6.   );
  7. }
  8. class MyApp extends StatelessWidget {
  9.   final List<String> items;
  10.   const MyApp({super.key, required this.items});
  11.   // This widget is the root of your application.
  12.   @override
  13.   Widget build(BuildContext context) {
  14.     const title = 'ListView的使用';
  15.     return MaterialApp(
  16.       debugShowCheckedModeBanner: false,
  17.       title: title,
  18.       theme: ThemeData(
  19.         colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
  20.         useMaterial3: true,
  21.       ),
  22.       home: Scaffold(
  23.           appBar: AppBar(
  24.             title: const Text(title),
  25.           ),
  26.           body:
  27.           ListView.builder(
  28.                 itemCount: items.length,
  29.                 prototypeItem: ListTile(
  30.                   title: Text(items.first),
  31.                 ),
  32.                 itemBuilder: (context, index) {
  33.                   return ListTile(
  34.                     title: Text(items[index]),
  35.                   );
  36.                 },
  37.               ),
  38.     );
  39.   }
  40. }
复制代码
运行结果图如下:

1.3 ListView.separated

ListVIew.separated相比ListView.builder只是每项之间增加了一个分割符合:
  1. void main() {
  2.   runApp(
  3.     MyApp(
  4.       items: List<String>.generate(10000, (i) => '列表 $i'),
  5.     ),
  6.   );
  7. }
  8. class MyApp extends StatelessWidget {
  9.   final List<String> items;
  10.   const MyApp({super.key, required this.items});
  11.   // This widget is the root of your application.
  12.   @override
  13.   Widget build(BuildContext context) {
  14.     const title = 'ListView的使用';
  15.     return MaterialApp(
  16.       debugShowCheckedModeBanner: false,
  17.       title: title,
  18.       theme: ThemeData(
  19.         colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
  20.         useMaterial3: true,
  21.       ),
  22.       home: Scaffold(
  23.           appBar: AppBar(
  24.             title: const Text(title),
  25.           ),
  26.           body:
  27.           ListView.separated(
  28.             itemCount: items.length,
  29.             separatorBuilder: (context, index) => const Divider(),
  30.             itemBuilder: (context, index) {
  31.               return ListTile(
  32.                 title: Text(items[index]),
  33.               );
  34.             },
  35.           ),
  36.     );
  37.   }
  38. }
复制代码
运行结果图如下:


二、自定义ListView样式和结构:

我们可以利用ListView.builder的itemBuilder属性来自定义列表项的样式和结构,下面一个例子是动态设置item结构背景
  1. void main() {
  2.   runApp(
  3.     MyApp(
  4.       items: List<String>.generate(10000, (i) => '列表 $i'),
  5.     ),
  6.   );
  7. }
  8. class MyApp extends StatelessWidget {
  9.   final List<String> items;
  10.   const MyApp({super.key, required this.items});
  11.   // This widget is the root of your application.
  12.   @override
  13.   Widget build(BuildContext context) {
  14.     const title = 'ListView的使用';
  15.     return MaterialApp(
  16.       debugShowCheckedModeBanner: false,
  17.       title: title,
  18.       theme: ThemeData(
  19.         colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
  20.         useMaterial3: true,
  21.       ),
  22.       home: Scaffold(
  23.           appBar: AppBar(
  24.             title: const Text(title),
  25.           ),
  26.           body:
  27.            ListView.builder(
  28.             itemCount: items.length,
  29.             itemBuilder: (context, index) {
  30.               return Container(
  31.                 color: index % 2 == 0 ? Colors.grey[300] : Colors.red,
  32.                 padding: const EdgeInsets.all(16),
  33.                 child: Text(items[index]),
  34.               );
  35.             },
  36.           ),
  37.         ),
  38.        );
复制代码
运行结果图如下:


三、ListView性能优化:

当利用ListView显示大量数据时,为了提高性能,推荐以下优化方式:

  • 利用ListView.builder或ListView.separated来按需构建列表项,避免一次性构建全部的项。
  • 利用ListView.separated并提供合适的分隔符构建方法,避免不须要的分隔符构建。
  • 假如列表项固定是高度,请利用itemExtent属性来指定项的高度,避免动态计算高度带来的性能开销。
  • 利用ScrollController来控制滚动,并利用addPostFrameCallback在构建完成后延迟加载数据。

总结:

上文我们介绍构建ListView常见的几种利用方法,以及简朴的自定义结构和样式方法的例子,优化ListView性能方式方法,利用ListView推荐利用ListView.builder、ListView.separated。
Thanks:
Flutter可滚动组件(2):ListView基本利用


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表