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

目录

  • 一、ListView构造方法
    • 1.1 常规方法
    • 1.2 ListView.builder
    • 1.3 ListView.separated
  • 二、自定义ListView样式和布局:
  • 三、ListView性能优化:
  • 总结:

一、ListView构造方法

主要以下几种方法:

  • 常规方法,直接使用默认的构造方法
  • ListView.builder
  • ListView.separated

1.1 常规方法

ListView的常规方法:就是利用默认方法构造各个item,ListView有个children属性:传入多个widget:

import 'package:flutter/material.dart';main(List<String> args) {runApp(const MyApp());
}class MyApp extends StatelessWidget {// This widget is the root of your application.Widget build(BuildContext context) {const title = 'ListView的使用';return MaterialApp(debugShowCheckedModeBanner: false,title: title,theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),useMaterial3: true,),home: Scaffold(appBar: AppBar(title: const Text(title),),body:MyHomeBody(),);}
}class MyHomeBody extends StatelessWidget {const MyHomeBody({super.key});final TextStyle textStyle = const TextStyle(fontSize: 10, color: Colors.blue);Widget build(BuildContext context) {return  ListView(children: List<Widget>.generate(100, (i) => Text('列表 $i')),);}
}

运行效果图如下:

常规方法

1.2 ListView.builder

List<Widget>.generate 会默认把所有子item全部创建出来,如果子item数量过多时,会影响页面的渲染时间,ListView.builder不会把所有子item创建出来,会在真正需要的时候构建出来,不会一开始全部初始化出来,适合数量很多item的场景:

void main() {runApp(MyApp(items: List<String>.generate(10000, (i) => '列表 $i'),),);
}class MyApp extends StatelessWidget {final List<String> items;const MyApp({super.key, required this.items});// This widget is the root of your application.Widget build(BuildContext context) {const title = 'ListView的使用';return MaterialApp(debugShowCheckedModeBanner: false,title: title,theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),useMaterial3: true,),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]),);},),);}
}

运行效果图如下:
ListView.builder

1.3 ListView.separated

ListVIew.separated相比ListView.builder只是每项之间增加了一个分割符合:

void main() {runApp(MyApp(items: List<String>.generate(10000, (i) => '列表 $i'),),);
}class MyApp extends StatelessWidget {final List<String> items;const MyApp({super.key, required this.items});// This widget is the root of your application.Widget build(BuildContext context) {const title = 'ListView的使用';return MaterialApp(debugShowCheckedModeBanner: false,title: title,theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),useMaterial3: true,),home: Scaffold(appBar: AppBar(title: const Text(title),),body:ListView.separated(itemCount: items.length,separatorBuilder: (context, index) => const Divider(),itemBuilder: (context, index) {return ListTile(title: Text(items[index]),);},),);}
}

运行效果图如下:
ListView.separated


二、自定义ListView样式和布局:

我们可以使用ListView.builder的itemBuilder属性来自定义列表项的样式和布局,下面一个例子是动态设置item布局背景

void main() {runApp(MyApp(items: List<String>.generate(10000, (i) => '列表 $i'),),);
}class MyApp extends StatelessWidget {final List<String> items;const MyApp({super.key, required this.items});// This widget is the root of your application.Widget build(BuildContext context) {const title = 'ListView的使用';return MaterialApp(debugShowCheckedModeBanner: false,title: title,theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),useMaterial3: true,),home: Scaffold(appBar: AppBar(title: const Text(title),),body:ListView.builder(itemCount: items.length,itemBuilder: (context, index) {return Container(color: index % 2 == 0 ? Colors.grey[300] : Colors.red,padding: const EdgeInsets.all(16),child: Text(items[index]),);},),),);

运行效果图如下:
自定义布局和样式


三、ListView性能优化:

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

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

总结:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESLint常见错误

1、Strings must use singlequote —— 字符串必须使用单引号 2、Extra semicolon semi——额外的分号&#xff1a;一行语句结尾不能添加分号 3、Unexpected trailing comma —— 行尾多了一个逗号 4、Newline required at end of file but not found ——文件结尾必须要新加…

Windows进行磁盘分区/扩容

Windows进行磁盘分区/扩容 导航 文章目录 Windows进行磁盘分区/扩容导航分区教程压缩卷教程 用Windows自带的磁盘管理进行分区/扩容&#xff0c;但有个东西需要说明下是&#xff1a; 物理特性限制 磁盘分区的物理特性决定了扩容操作的方向。在磁盘上&#xff0c;数据是线性存储…

获取类路径

分析 String pathThread.currentThread().getContextClassLoader().getResource("log").getPath(); 这行代码用于获取类路径(classpath)下名为"log"的资源的文件系统路径&#xff0c;我来详细解析它的执行过程和潜在问题&#xff1a; 1. 代码分解解析 j…

安装fvm可以让电脑同时管理多个版本的flutter、flutter常用命令、vscode连接模拟器

打开 PowerShellfvm安装 dart pub global activate fvm安装完成后&#xff0c;如果显示FVM无法识别&#xff0c;那么需要去添加环境变量path添加这个&#xff1a;C:\Users\Administrator\AppData\Local\Pub\Cache\bin 常用命令 fvm releases 查看用户可以装的flutter版本fvm l…

Kaggle-Disaster Tweets-(二分类+NLP+模型融合)

Disaster Tweets 题意&#xff1a; 就是给出一个dataframe包含text这一列代表着文本&#xff0c;文本会有一些词&#xff0c;问对于每条记录中的text是真关于灾难的还是假关于灾难的。 比如我们说今天作业真多&#xff0c;这真是一场灾难。实际上这个灾难只是我们调侃而言的。…

Flutter 2025 Roadmap

2025 这个路线图是有抱负的。它主要代表了我们这些在谷歌工作的人收集的内容。到目前为止&#xff0c;非Google贡献者的数量超过了谷歌雇佣的贡献者&#xff0c;所以这并不是一个详尽的列表&#xff0c;列出了我们希望今年Flutter能够出现的所有令人兴奋的新事物&#xff01;在…

如何通过API接口获取淘宝商品价格?实操讲解

要通过API接口获取淘宝商品价格&#xff0c;需使用淘宝开放平台&#xff08;Taobao Open Platform, TOP&#xff09;提供的商品详情API&#xff08;如taobao.item.get或taobao.item_get&#xff09;。以下是完整的实操步骤&#xff1a; 一、前期准备 注册淘宝开放平台账号 访问…

按键精灵安卓/ios脚本辅助工具开发教程:如何把界面配置保存到服务器

在使用按键精灵工具辅助的时候&#xff0c;多配置的情况下&#xff0c;如果保存现有的配置&#xff0c;并且读取&#xff0c;尤其是游戏中多种任务并行情况下&#xff0c;更是需要界面进行保存&#xff0c;简单分享来自紫猫插件的配置保存服务器写法。 界面例子&#xff1a; …

DP34 【模板】前缀和 -- 前缀和

目录 一&#xff1a;题目 二&#xff1a;算法原理 三&#xff1a;代码实现 一&#xff1a;题目 题目链接&#xff1a;【模板】前缀和_牛客题霸_牛客网 二&#xff1a;算法原理 三&#xff1a;代码实现 #include <iostream> #include <vector> using namespac…

关于我的服务器

最近我买了台腾讯云服务器&#xff0c;然后新手小白只会用宝塔。。。 安装完之后默认的端口是8888&#xff0c;打开面板就会提示我有风险。然后 我改了端口之后&#xff0c;怎么都打不开。 于是 学到了几句命令可以使用&#xff1a; //查看端口是否已经修改成功 cat www/se…

机器学习常用算法总结

1. 概述 机器学习的定义是对于某类任务T和性能度量P&#xff0c;如果一个计算机程序在T上其性能P随着经验E而自我完善&#xff0c;那么我们就称这个系统从经验E中学习&#xff0c;机器学习是人工智能的一种方法&#xff0c;它通过在大量数据中学习隐藏的规则&#xff0c;模式和…

ns-3中UDP饱和流发包时间间隔设置最合理值

ns3的官方手册很全&#xff0c;相关书籍也是有的&#xff0c;官网先贴在这里&#xff1a; ns-3 | a discrete-event network simulator for internet systemsa discrete-event network simulator for internet systemshttps://www.nsnam.org/相关的脚本介绍也都有一些&#xf…

Windsurf代码依赖检查导入

目录 1. 在全局配置中根据需求设置检查的文件&#xff0c;以python为例 2. 执行命令生成requirements.txt文件&#xff0c;此操作可以将当前代码所需的依赖全部写入 3. 在Cascade对话窗口输入detect-dependencies查询 4. 根据查询出来的结果优化requirements.txt&#xff0c;可…

复变函数摘记3

复变函数摘记3 5. 留数5.1 可去奇点、极点、本性奇点5.2 零点与极点的关系5.3 在无穷远点处的情形5.4 留数 5. 留数 \quad 如果函数 f ( z ) f(z) f(z) 在 z 0 z_0 z0​ 及 z 0 z_0 z0​ 的邻域内处处可导&#xff0c;那么称 f ( z ) f(z) f(z) 在点 z 0 z_0 z0​ 处解析。…

vscode格式化为什么失效?自动保存和格式化(Prettier - Code formatter,vue-format)

vscode自动格式化保存最终配置 博主找了好多的插件&#xff0c;也跟着教程配置了很多&#xff0c;结果还是没有办法格式化&#xff0c;最终发现了一个隐藏的小齿轮&#xff0c;配置完后就生效了 关键步骤 关键配置 一定要点小齿轮&#xff01;&#xff01;&#xff01; 这个小…

Framer Motion简介

Framer Motion 是什么&#xff1f; Framer Motion 是一个 用于 React 的现代动画库&#xff0c;专为创建流畅、高性能且富有表现力的动画而设计。它不仅适合简单的 UI 动效&#xff0c;也能优雅地实现复杂的动画编排与手势交互。 &#x1f680; 为什么选择 Framer Motion&…

多种方案对比实现 Kaggle 比赛介绍进行行业分类

Kaggle 平台汇集了大量来自不同行业的数据科学竞赛&#xff0c;但这些比赛的标题或简介往往表述多样、不易直接归类。无论是做项目归档、行业研究&#xff0c;还是搭建竞赛推荐系统&#xff0c;都需要一个可靠的方法来将比赛自动归入对应行业标签。 本教程提供使用 HuggingFac…

Android Jni(二)加载调用第三方 so 库

文章目录 Android Jni&#xff08;二&#xff09;加载调用第三方 so 库前置知识CPU架构 ABI 基本步骤1、将第三方 SO 库文件放入项目中的正确位置&#xff1a;2. 创建 JNI 接口3. 实现 JNI 层代码4、配置 CMake 常见问题解决1、UnsatisfiedLinkError&#xff1a;2、函数找不到&…

服务器本地搭建

socket函数 它用于创建一个新的套接字&#xff08;socket&#xff09;。 函数原型 #include <sys/socket.h> int socket(int domain, int type, int protocol);参数解释 domain&#xff1a;它指定了通信所使用的协议族&#xff0c;常见的取值如下&#xff1a; AF_INET…

MIP-Splatting:全流程配置与自制数据集测试【ubuntu20.04】【2025最新版】

一、引言 在计算机视觉和神经渲染领域&#xff0c;3D场景重建与渲染一直是热门研究方向。近期&#xff0c;3D高斯散射&#xff08;3D Gaussian Splatting&#xff09;因其高效的渲染速度和优秀的视觉质量而受到广泛关注。然而&#xff0c;当处理大型复杂场景时&#xff0c;这种…