【Flutter】列表流畅性优化

news2024/11/19 18:27:36

前言

在日常APP的开发中,列表是使用频率最高的,这里讲述在Flutter中优化列表的滑动速度与流畅度,以来提高用户的体验。

方案

1、使用ListView.builder代替ListView

ListView.builder在创建列表的时候要比ListView更高效,因为ListView.builder只在需要的时候创建那些可见的列表。

ListView.builder(
  itemCount: 100,
  itemBuilder: (context, index) {
    return ListTile(
      title: Text('ZFJ index = $index'),
    );
  },
);

2、使用const修饰符

在构建列表的时候尽量用const修饰符来创建不变的控件,这样可以减少控件的重复创建,从来提高性能。

return const ListTile(
  title: Text('ZFJ index = $index'),
);

3、避免使用复杂的布局

简化列表的布局,尽量减少嵌套重量级的部件,比如Container或者Column,使用轻量级的部件,比如Text、Padding、SizedBox等等。

👉👉👉什么是轻量级部件?👈👈👈

在 Flutter 中,轻量级是个相对概念,轻量级的部件是那些尽量减少计算和绘制开销的组件。它们对性能影响较小,适合在性能敏感的场景中使用,如列表项、频繁重建的视图等。以下是一些常见的轻量级部件:

Container:

简单的容器组件,用于布局、背景颜色、边框等。比 DecoratedBox 更轻量。

Text:

用于显示文本,是非常轻量级的组件。避免过多的 Text.rich,因为它会增加计算开销。

Padding:

用于添加内边距的轻量级组件。比直接在 Container 中设置 padding 更高效。

Align:

用于对齐子组件的轻量级组件。比使用 Center 或 Padding+Align 组合更高效。

SizedBox:

用于设置固定尺寸的轻量级组件。比在 Container 中设置 width 和 height 更高效。

Icon:

用于显示图标的轻量级组件。尽量避免使用过多自定义绘制的图标。

ClipRRect:

用于裁剪圆角矩形的轻量级组件。比使用 Container+BoxDecoration 更高效。

Opacity:

用于设置透明度的轻量级组件。比使用复杂的 DecoratedBox 透明度设置更高效。

Flexible 和 Expanded:

用于在 Row 和 Column 中调整子组件大小的轻量级组件。比直接在 Container 中设置 width 和 height 更高效。

4、使用CacheExtent

通过设置 cacheExtent 属性,可以增加预加载的区域大小,从而减少滑动时的卡顿现象。

ListView.builder(
  itemCount: 100,
  cacheExtent: 300, // 默认值是 250.0,单位是像素
  itemBuilder: (context, index) {
    return ListTile(
      title: Text('Item $index'),
    );
  },
);

5、使用Image的缓存功能

如果列表项中包含图片,可以使用 CachedNetworkImage 等库来缓存图片,避免每次滑动时重新加载图片。

import 'package:cached_network_image/cached_network_image.dart';

ListTile(
  leading: CachedNetworkImage(
    imageUrl: 'https://zfjsafe.com/images/ZFJObsLib.png',
    placeholder: (context, url) => CircularProgressIndicator(),
    errorWidget: (context, url, error) => Icon(Icons.error),
  ),
  title: Text('ZFJ Index = $index'),
);

6、避免不必要的重绘

确保只有需要更新的部分进行重绘,可以使用 StatefulWidget 和 setState 来实现局部刷新,而不是重建整个列表。

7、使用 AutomaticKeepAliveClientMixin

如果需要保留列表项的状态,可以使用 AutomaticKeepAliveClientMixin 来保留列表项的状态,而不是每次滑动时都重新构建。

class ZFJListItem extends StatefulWidget {
  
  _ZFJListItemState createState() => _ZFJListItemState();
}

class _ZFJListItemState extends State<ZFJListItem> with AutomaticKeepAliveClientMixin {
  
  Widget build(BuildContext context) {
    super.build(context);
    return ListTile(
      title: Text('ZFJ'),
    );
  }

  
  bool get wantKeepAlive => true;
}

8、使用ReorderableListView

如果需要支持拖拽排序,可以使用 ReorderableListView,这种组件在处理大量数据时更加高效。

ReorderableListView(
  onReorder: (oldIndex, newIndex) {
    setState(() {
      if (newIndex > oldIndex) {
        newIndex -= 1;
      }
      final item = _items.removeAt(oldIndex);
      _items.insert(newIndex, item);
    });
  },
  children: _items.map((item) {
    return ListTile(
      key: ValueKey(item),
      title: Text(item),
    );
  }).toList(),
);

结束语

通过这些优化策略,可以显著提升 Flutter 应用中列表的滑动性能,提供更加流畅的用户体验,欢迎大家补充。
在这里插入图片描述

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

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

相关文章

Python题解Leetcode Hot100之二叉树

1. 二叉树的中序遍历 题目描述 给定一个二叉树&#xff0c;返回它的中序遍历。解题思路 使用递归的方法对左子树进行中序遍历&#xff0c;然后访问根节点&#xff0c;最后对右子树进行中序遍历。也可以使用栈来模拟递归的过程&#xff0c;迭代地进行中序遍历。代码class Solut…

机器人控制系列教程之Delta机器人运动学分析(1)

并联机构运动学 对于并联机构的位置正解、位置逆解和对应于位置解的速度、加速度进行分析是并联机构运动学分析主要内容。与串联机构不同&#xff0c;一般并联机构的位置逆解相对要简单&#xff0c;而位置正解则求解比较复杂些。并联机构的位置正解的求解过程中&#xff0c;大…

云徙电商OMS如何赋能品牌电商业务精细化运营

「6.18」、「双十一」、「双十二「、「年货节」等等&#xff0c;如火如荼的「造节」&#xff0c;将电商不断推向高地。 关于电商业务&#xff0c;一个业内共识是&#xff0c;2003 年是线上线下业务切换的关键节点。而消费者需求的变迁是引发这场业务模式革新的核心推手。 盘点…

Crossover和PD虚拟机谁更强大?pd虚拟机一年多少钱

在当前的虚拟化技术和应用程序兼容性解决方案中&#xff0c;Crossover和PD虚拟机&#xff08;Parallels Desktop&#xff09;都是备受用户喜爱的选择。对于需要在非原生系统上运行应用程序的用户而言&#xff0c;选择合适的工具尤为重要。那么&#xff0c;Crossover和PD虚拟机谁…

d3dx9_43.dll丢失怎么解决?d3dx9_43.dll怎么安装详细教程

在使用计算机中&#xff0c;如果遇到d3dx9_43.dll丢失或许找不到d3dx9_43.dll无法运行打开软件怎么办&#xff1f;这个是非常常见问题&#xff0c;下面我详细介绍一下d3dx9_43.dll是什么文件与d3dx9_43.dll的各种问题以及d3dx9_43.dll丢失的多个解决方法&#xff01; 一、d3dx9…

vue3+ts 写echarts 中国地图

需要引入二次封装的echarts和在ts文件写的option <template><div class"contentPage"><myEcharts :options"chartOptions" class"myEcharts" id"myEchartsMapId" ref"mapEcharts" /></di…

vscode语言模式

1.背景 写vue3ts项目的时候&#xff0c;用到了volar插件&#xff0c;在单文件使用的时候&#xff0c;鼠标悬浮在代码上面会有智能提示&#xff1b; 但是最近volar插件提示被弃用了&#xff0c;然后我按照它的官方提示&#xff0c;安装了Vue-official扩展插件&#xff0c;但是…

【开发篇】明明配置跨域声明,为什么却仍可以发送HTTP请求

一、问题 在SpringBoot项目中&#xff0c;明确指定仅允许指定网站跨域访问&#xff1a; 为什么开发人员却仍旧可以通过HTTP工具调用接口&#xff1f; 二、为什么 在回答这个问题之前&#xff0c;我们首先要了解一下什么是CORS&#xff01; 1、什么是CORS CORS的全称为跨域资源…

20240702在飞凌OK3588-C开发板上通过HDMI OUT输出USB3.0接口的热像仪的预览图像

20240702在飞凌OK3588-C开发板上通过HDMI OUT输出USB3.0接口的热像仪的预览图像 2024/7/2 18:19 rootok3588:/# rootok3588:/# rootok3588:/# lsusb Bus 005 Device 001: ID 1d6b:0002 Bus 003 Device 001: ID 1d6b:0001 Bus 001 Device 001: ID 1d6b:0002 Bus 006 Device 00…

普发PfeifferTC400真空泵驱动操作手侧引脚定义通讯定义

普发PfeifferTC400真空泵驱动操作手侧引脚定义通讯定义

shellhub 部署

1、环境介绍 操作系统&#xff1a;龙蜥os 7.9 2、安装docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i sdownload.docker.commirrors.aliyun.c…

美的、希亦、苏泊尔超声波清洗机值不值得买?对比测评甄选性能王!

超声波清洗机作为一种高效、便捷的清洁设备&#xff0c;不仅可以用于清洗眼镜&#xff0c;还可以用于清洗化妆刷、珠宝、手表等多种物品&#xff0c;极大的方便了日常生活。其高频振动的特点可以帮助去除物品表面的污垢和细菌&#xff0c;让物品焕然一新。因此&#xff0c;选择…

YOLOv8改进 | 卷积模块 | 减少冗余计算和内存访问的PConv【CVPR2023】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

最小步数模型——AcWing 1107. 魔板

最小步数模型 定义 最小步数模型通常是指在某种约束条件下&#xff0c;寻找从初始状态到目标状态所需的最少操作或移动次数的问题。这类问题广泛存在于算法、图论、动态规划、组合优化等领域。具体来说&#xff0c;它涉及确定一个序列或路径&#xff0c;使得按照特定规则执行…

【JS】纯web端使用ffmpeg实现的视频编辑器-视频合并

纯前端实现的视频合并 接上篇ffmpeg文章 【JS】纯web端使用ffmpeg实现的视频编辑器 这次主要添加了一个函数&#xff0c;实现了视频合并的操作。 static mergeArgs(timelineList) {const cmd []console.log(时间轴数据,timelineList)console.log("文件1",this.readD…

BAS(入侵与攻击模拟)正在替代红队测试?

之前经常会被用户问到&#xff0c;漏扫、渗透和红队红的区别是啥&#xff1f; 传统的漏扫、渗透和红蓝对抗&#xff0c;可以看到工具化的漏洞不可靠&#xff0c;人工的成本就高。怎么找到一个漏洞可信度又高&#xff0c;成本又低的&#xff0c;就诞生了BAS。 抛开漏扫&#xf…

多商户b2b2c商城系统怎么运营

B2B2C多用户商城系统支持多种运营模式&#xff0c;以满足不同类型和发展阶段的企业需求。以下是五大主要的运营模式&#xff1a; **1. 自营模式&#xff1a;**平台企业通过建立自营线上商城&#xff0c;整合自身多渠道业务。通过会员、商品、订单、财务和仓储等多用户商城管理系…

windows自带的性能采集配置方法

1 计算机---右键---管理 2 性能--数据收集器几---用户自定义 3新建--输入程序名称 并在此页面选择--手动创建&#xff08;高级&#xff09; 4 下一步--勾选性能计数器---下一步 5 添加--找到process Processor Time User Time Handle Count ID Process Private Bytes…

Java8新特性之Optional、Lambda表达式、Stream、新日期Api使用总结

标题 Optional类常用Api使用说明Optional API 使用建议 Lambda表达式Lambda 表达式的局限性与解决方案 Stream案例实操优化 Stream 操作 新的日期和时间APILocalDateTime在SpringBoot中的应用 函数式接口&#xff08;Functional&#xff09; Optional博客参考地址1 Stream博客参…

核心实验:基于Web前端的性能测试分析!

实验简介 本实验主要利用IE和Chrome的F12开发人员工具结合Web前端测试分析相关知识&#xff0c;对常见网站进行基于前端的性能测试分析&#xff0c;本实验将不会使用到测试开发相关技术&#xff0c;而是纯粹意义上的手工测试&#xff0c;但却是很容易找到系统前端性能及设计问…