当前位置: 首页 > news >正文

Flutter Listview 缓存item滑动后不进行重新渲染

使用KeepAliveWrapper包裹:
KeepAliveWrapper源码:

class KeepAliveWrapper extends StatefulWidget {const KeepAliveWrapper({Key? key, @required this.child, this.keepAlive = true}): super(key: key);final Widget? child;final bool keepAlive;@overrideState<KeepAliveWrapper> createState() => _KeepAliveWrapperState();
}class _KeepAliveWrapperState extends State<KeepAliveWrapper>with AutomaticKeepAliveClientMixin {@overrideWidget build(BuildContext context) {return widget.child!;}@overridebool get wantKeepAlive => widget.keepAlive;@overridevoid didUpdateWidget(covariant KeepAliveWrapper oldWidget) {if (oldWidget.keepAlive != widget.keepAlive) {// keepAlive 状态需要更新,实现在 AutomaticKeepAliveClientMixin 中updateKeepAlive();}super.didUpdateWidget(oldWidget);}
}

使用示例:

@override
Widget build(BuildContext context) {var children = <Widget>[];for (int i = 0; i < 6; ++i) {//只需要用 KeepAliveWrapper 包装一下即可children.add(KeepAliveWrapper(child:Page( text: '$i'));}return PageView(children: children);
}

测试下:

class KeepAliveDemo extends StatelessWidget {const KeepAliveDemo({Key? key,}) : super(key: key);@overrideWidget build(BuildContext context) {return PageView.builder(itemCount: 5,itemBuilder: (BuildContext ctx, int index) {return KeepAliveWrapper(child: PageItem(text: "$index"),keepAlive: true,);},);}
}class PageItem extends StatelessWidget {PageItem({this.text});final String? text;@overrideWidget build(BuildContext context) {print("flutter build ${text}");return Center(child: Text(text!, textScaleFactor: 5.0));}
}

运行发现,keepAlive为true时每个Item都缓存了,为false时,每个Item都会重新创建,OK。

转自:【致程序猿】Flutter 之 可滚动组件子项缓存 KeepAlive_keepalivewrapper-CSDN博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • “论面向服务架构设计及其应用”写作框架,软考高级,系统架构设计师
  • Selenium与Web Scraping:自动化获取电影名称和评分的实战指南
  • 中级经济师考试通过率有多少?难度如何?
  • Android 架构模式之 MVP
  • 编程之路:从挫折到突破的心路历程
  • SQLite 插入一行并返回主键
  • 【人工智能】Transformers之Pipeline(十二):零样本物体检测(zero-shot-object-detection)
  • C# 获取当前电脑的mac地址
  • C#使用onnxruntime加载模型,部署到别人的PC上报错
  • UE5.4内容示例(5)UI_CommonUI - 学习笔记
  • Neo4j 图数据库入门
  • Kafka基本概念
  • 知乎信息流广告推广开户需要什么资质?
  • uniapp/vue如何实现一个子表单及子表单作用
  • 多核时代下线程间的内存可见性
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • bearychat的java client
  • ES6简单总结(搭配简单的讲解和小案例)
  • Js基础知识(一) - 变量
  • PAT A1017 优先队列
  • 初识 webpack
  • 关于 Cirru Editor 存储格式
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 马上搞懂 GeoJSON
  • 区块链将重新定义世界
  • 如何在 Tornado 中实现 Middleware
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 学习ES6 变量的解构赋值
  • scrapy中间件源码分析及常用中间件大全
  • 阿里云移动端播放器高级功能介绍
  • #14vue3生成表单并跳转到外部地址的方式
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (javaweb)Http协议
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (图)IntelliTrace Tools 跟踪云端程序
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (自用)仿写程序
  • **CI中自动类加载的用法总结
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET CF命令行调试器MDbg入门(一)
  • .net core开源商城系统源码,支持可视化布局小程序
  • .Net Remoting(分离服务程序实现) - Part.3
  • .Net 执行Linux下多行shell命令方法
  • :class的用法及应用
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [001-03-007].第07节:Redis中的事务