flutter CustomScrollView sliverList内数据变化会导致每个item都会重新build flutter的listview
chenpack 2025-06-27 02:00 36 浏览 0 评论

Flutter 应用程序以其精美的设计和流畅的功能而闻名,但性能问题会很快破坏用户体验。借助这 个优化性能的专家技巧,将您的应用提升到一个新的水平。
使用 WidgetsBindingObserver 跟踪应用程序的生命周期
使用“WidgetsBindingObserver”来跟踪您的应用程序的生命周期。此观察器允许您在应用程序恢复、暂停或不活动时接收回调,这可以帮助您识别性能瓶颈并优化应用程序的行为。
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
@override
void initState() {
WidgetsBinding.instance.addObserver(this);
super.initState();
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
// Handle state changes here
}
//...
}
复制
使用 RepaintBoundary 小部件隔离应用程序的各个部分
使用“RepaintBoundary”小部件来隔离导致性能问题的应用程序部分。“RepaintBoundary”小部件可用于包装导致性能问题的小部件,以便应用程序的其余部分可以继续平稳运行。
RepaintBoundary(
child: MyExpensiveWidget(),
);
复制
使用 InheritedWidget 获取数据
将“InheritedWidget”用于向下传递到小部件树的数据。“InheritedWidget”是一种特殊的小部件,可用于将数据向下传递到小部件树中,这有助于减少重建次数并提高性能。
class MyInheritedWidget extends InheritedWidget {
final int myData;
MyInheritedWidget({
Key key,
@required this.myData,
@required Widget child,
}) : super(key: key, child: child);
@override
bool updateShouldNotify(MyInheritedWidget old) => myData != old.myData;
static MyInheritedWidget of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
}
}
复制
使用 StreamBuilder 而不是 FutureBuilder
尽可能使用“StreamBuilder”而不是“FutureBuilder”。“StreamBuilder”允许您在更新发生时接收更新,这有助于减少重建次数并提高性能。
StreamBuilder(
stream: myStream,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data);
} else if (snapshot.hasError) {
return Text(snapshot.error);
}
return CircularProgressIndicator();
},
);
复制
使用 CustomScrollView 而不是 ListView
尽可能使用“CustomScrollView”而不是“ListView”。“CustomScrollView”比“ListView”更高效,因为它只构建当前在屏幕上可见的小部件。
CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return MyListItem(data: myData[index]);
},
childCount: myData.length,
),
),
],
);
复制
使用 AnimationController 来控制动画
使用“AnimationController”来控制动画。“AnimationController”允许您控制动画的时间和进度,这有助于减少重建次数并提高性能。
class MyAnimationWidget extends StatefulWidget {
@override
_MyAnimationWidgetState createState() => _MyAnimationWidgetState();
}
class _MyAnimationWidgetState extends State<MyAnimationWidget>
with SingleTickerProvider{
AnimationController _controller;
@override
void initState() {
_controller = AnimationController(vsync: this, duration: Duration(seconds: 2));
super.initState();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _controller,
builder: (context, child) {
// Use _controller.value to control the animation
return Transform.translate(
offset: Offset(0, _controller.value * ),
child: child,
);
},
child: MyChildWidget(),
);
}
}
复制
使用 Wrap 小部件而不是 ListView 小部件
尽可能使用“Wrap”小部件而不是“ListView”小部件。“Wrap”小部件比“ListView”更高效,因为它只构建当前在屏幕上可见的小部件。
Wrap(
children: myChildren.map((child) => MyChildWidget(child)).toList(),
);
复制
使用 CustomPainter 小部件绘制复杂图形
使用“CustomPainter”小部件绘制复杂的图形。“CustomPainter”小部件允许您直接在画布上绘制,这比构建大量嵌套的画布要高效得多
class MyCustomPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
// Draw complex graphics on the canvas
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return false;
}
}
复制
使用 PerformanceOverlay 小部件查看应用程序性能的实时可视化。
使用“PerformanceOverlay”小部件查看应用程序性能的实时可视化。此小部件可以帮助您识别应用程序中可能导致性能问题的区域,并为您提供有关如何优化它们的想法。
PerformanceOverlay(
enabled: true,
overlayRect: Rect.fromLTWH(0, 0, , ),
children: [
// Your widgets
],
);
复制
使用 Dart 内置的 Profile 和 Release 模式来测试性能
使用 Dart 内置的“Profile”和“Release”模式来测试性能。配置文件模式为您提供详细的性能信息,发布模式优化应用程序的性能和速度,这将帮助您识别和修复性能问题。
flutter run --profile
或者
flutter run --release
请注意,这些只是代码的示例。
相关推荐
- RouterOS 端口映射 (远程桌面)
-
一款功能强大的路由器系统-软路由-RouterOS推荐一款路由器系统,头条有很多喜欢使用软路由伙伴可能有很多都不知道RouterOS这个路由系统是,RouterOS是由拉脱维亚MikroTik...
- 神经网络中的编码器 神经网络视频编码
-
神经网络算法-一文搞懂Transformer(总体架构&三种注意力层)本文将从Transformer的本质、Transformer的原理、Transformer的应用三个方面,带您一...
- 必备资料103个WindowsXP运行命令
-
Windows中CMD最全命令行CMD命令:开始->运行(或者Windows+R)->键入cmd或command(在命令行里可以看到系统版本、文件系统版本)CMD命令锦集1.gpedit...
- 固态硬盘无法格式化怎么办
-
Windows中固态硬盘无法格式化怎么办?固态硬盘(简称SSD)是一种数据存储设备,与传统机械硬盘相比,它在许多方面表现得更好。因此,越来越多的用户希望使用固态硬盘,但是当人们购买固态硬盘后准备将其格...
- 手机信令数据分析_手机信令数据分析过程代码
-
清华大学公共管理学院刘志林教授:探索手机信令数据在城市治理中的应用中国发展网讯日前,由中国人民大学首都发展与战略研究院(以下简称“首发院”)主办的首都大讲堂(第7期)暨地方治理工作坊第二期在京举办。...
- python开发ping工具 ipad python开发工具
-
python之ping主机#coding=utf-8frompythonpingimportpingforiinrange,):ip=.+str(i)...
- 云容灾关键技术点简介_云容器技术
-
阿里云发布企业级云灾备解决方案:一键容灾、成本节省%5月日,阿里云对外发布了企业级云灾备解决方案。据介绍,此次发布的灾备解决方案来自阿里巴巴IT基础设施云化的灾备经验,完全省去灾备机房的建设规划,可大...
- 域名泛解析设置_域名解析包括泛域名解析
-
如何降低域名被恶意泛解析的风险买车用车不想被忽悠,就请关注缸微信号:kf12gang←长按可复制。我们每天将免费为您解答选车用车的相关问题。作者:QQ126058域名被恶意泛解析是域名安全最常见的问...
- 人人通云平台怎么注册 人人通云教学登录账号
-
世界那么大,她看到了:一个心理咨询师的十年心灵之旅来源:环球网“世界那么大,我想去看看。”十年前的那个春天,十个字的辞职信,戳中了无数国人的心,激起了无数个“诗和远方”的小梦想,被称为“史上最具情怀...
- 民用远程监控手机软件_民用远程监控手机软件下载
-
屏幕监控软件有哪些?3款好用的监控软件分享!管控摸鱼小case!作为企业管理者,我深知员工工作效率和信息安全的重要性。在日常管理中,我时常会遇到这样的难题:员工是否在认真工作?有没有利用公司资源做与工...
- 重量级!Maven史上最全教程,看了必懂
-
对8个MCP服务器框架的比较作者:FrankGoortani编译:小兰引言模型上下文协议(MCP)是一种新标准,用于以统一方式将AI助手(如LLM)与外部数据源和工具连接起来。自推出以来,各种框架已...
- 面试字节跳动,收到offer后我却拒绝了 ,给面试人的一些忠告!
-
面试字节跳动,我被面试官狂怼全过程!来源:https://www.zhihu.com/question//answer/人们都说,这个世界上有两种人注定单身,一种是太优秀的,另一种是太平凡的。我一听呀...
- ps1手柄 python Ps1手柄真假
-
别再花冤枉钱!教你一分钟辨别“真假”超皮秒▌什么是超皮秒?皮秒激光,就是每个激光发射的脉冲持续时间(脉宽)达到皮秒级别的激光;1ps等于的负次方秒,超皮秒其实是一种商业名称,本质上也是皮秒激光设备,我...
- 路由器接交换机UPLINK还是
-
最全攻略!网络小白也能看懂的交换机连接方法号主:老杨丨年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部中午好,我的网工朋友。在网络设备的世界里,交换机是不可或缺的存在。不同的连接方法...
- tempdb 清理 tempdb可以删除吗
-
无需改代码,提高SQLSERVER数据库性能的个最简单方法众所周知SQLSERVER是微软的数据库拳头产品,有着图形化友好界面、操作门槛低、部署难度小,一键式安装的特点,受到全球开发者及企业的青睐...
你 发表评论:
欢迎- 一周热门
-
-
维基百科Wikipedia镜像网站列表
-
超炫html+css+javascript幻化3D相册 (含背景音乐)程序员表白必备
-
6款图片查看器,丝滑干净无广告!(图片查看器软件)
-
不能读取文件“itunes.library.itl”因为它是由更高级别的itunes所创建的
-
用java编写一个QQ群发信息_用java语言写qq聊天程序
-
StreamReader StringReader 区别 reader和inputstream的区别
-
安卓系统手机文件夹及其文件详细解析
-
Windows Server 2003 详细安装与配置
-
作为一名独立开发者,我是如何建立我的科技创业公司的
-
计算机集成制造系统有哪些_计算机集成制造系统有哪些类型
-
- 最近发表
- 标签列表
-
- int.tryparse (62)
- list转list (108)
- repeat函数 (66)
- git force (69)
- springboot /error (71)
- mysql 更新 (74)
- save as pdf (63)
- lock tables (66)
- 同步 异步 阻塞 非阻塞 (62)
- rsyslog (66)
- querystring (63)
- c++ override (70)
- css 动画库 (61)
- vsphere web client (65)
- int32_t (63)
- c# task.run (68)
- find -size (64)
- golang flag包 (70)
- 二维数组作为参数传入函数 (62)
- sudo su root (60)
- crontab 安装 (61)
- c# 数组转成list (60)
- 下拉按钮 (64)
- 滚动条美化 (61)
- stringutils (61)