Flutter嵌套地狱

在这里插入图片描述


@override
Widget build(BuildContext context) {return Column(children: <Widget>[Container(height: 45,child: Row(children: <Widget>[SizedBox(width: 30,),Icon(Icons.notifications,color: Colors.blue,),SizedBox(width: 30,),Expanded(child: Text('消息中心'),),Container(padding: EdgeInsets.symmetric(horizontal: 10),decoration: BoxDecoration(shape: BoxShape.rectangle,borderRadius: BorderRadius.all(Radius.circular(50)),color: Colors.red),child: Text('2',style: TextStyle(color: Colors.white),),),SizedBox(width: 15,),],),),Divider(),//类似上面的布局写6个],);
}

或许说可以将每一个 Item封装为一个方法,写法如下:


_buildItem(IconData iconData, Color iconColor, String title, Widget widget) {return Container(height: 45,child: Row(children: <Widget>[SizedBox(width: 30,),Icon(iconData,color: iconColor,),SizedBox(width: 30,),Expanded(child: Text('$title'),),widget,SizedBox(width: 15,),],),);
}@override
Widget build(BuildContext context) {return Column(children: <Widget>[_buildItem(...),Divider(),_buildItem(...),Divider(),_buildItem(...),Divider(),_buildItem(...),Divider(),_buildItem(...),Divider(),_buildItem(...),Divider(),],);
}

这样看起来好多了,基本解决了嵌套地狱问题,但这样写还存在一个非常大的问题-性能问题,一旦其中一个数字发生变化,整个页面都要重建,Flutter 开发中非常重要的一个原则就是 尽可能少的重建组件,因此将上面封装到方法中组件变为一个 Widget。


class SettingDemo extends StatelessWidget {@overrideWidget build(BuildContext context) {return Column(children: <Widget>[_SettingItem(iconData: Icons.notifications,iconColor: Colors.blue,title: '消息中心',suffix: _NotificationsText(text: '2',),),Divider(),_SettingItem(iconData: Icons.thumb_up,iconColor: Colors.green,title: '我赞过的',suffix: _Suffix(text: '121篇',),),Divider(),_SettingItem(iconData: Icons.grade,iconColor: Colors.yellow,title: '收藏集',suffix: _Suffix(text: '2个',),),Divider(),_SettingItem(iconData: Icons.shopping_basket,iconColor: Colors.yellow,title: '已购小册',suffix: _Suffix(text: '100个',),),Divider(),_SettingItem(iconData: Icons.account_balance_wallet,iconColor: Colors.blue,title: '我的钱包',suffix: _Suffix(text: '10万',),),Divider(),_SettingItem(iconData: Icons.location_on,iconColor: Colors.grey,title: '阅读过的文章',suffix: _Suffix(text: '1034篇',),),Divider(),_SettingItem(iconData: Icons.local_offer,iconColor: Colors.grey,title: '标签管理',suffix: _Suffix(text: '27个',),),],);}
}class _SettingItem extends StatelessWidget {const _SettingItem({Key key, this.iconData, this.iconColor, this.title, this.suffix}): super(key: key);final IconData iconData;final Color iconColor;final String title;final Widget suffix;@overrideWidget build(BuildContext context) {return Container(height: 45,child: Row(children: <Widget>[SizedBox(width: 30,),Icon(iconData,color: iconColor,),SizedBox(width: 30,),Expanded(child: Text('$title'),),suffix,SizedBox(width: 15,),],),);}
}class _NotificationsText extends StatelessWidget {final String text;const _NotificationsText({Key key, this.text}) : super(key: key);@overrideWidget build(BuildContext context) {return Container(padding: EdgeInsets.symmetric(horizontal: 10),decoration: BoxDecoration(shape: BoxShape.rectangle,borderRadius: BorderRadius.all(Radius.circular(50)),color: Colors.red),child: Text('$text',style: TextStyle(color: Colors.white),),);}
}class _Suffix extends StatelessWidget {final String text;const _Suffix({Key key, this.text}) : super(key: key);@overrideWidget build(BuildContext context) {return Text('$text',style: TextStyle(color: Colors.grey.withOpacity(.5)),);}
}

封装为一个个单独的小组件,将有变化的组件尽量单独封装,这样就不会重建整个控件树,增强了可读性和可维护性,而且对性能有很大的提升。

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

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

相关文章

AI聊天对话工具,让沟通更简单轻松

人工智能技术的发展不断为我们带来新的惊喜和变革&#xff0c;其中之一就是ai聊天对话应用。这种应用利用自然语言处理、机器学习和对话管理等技术&#xff0c;在智能手机、电脑等设备上实现了人机对话&#xff0c;让人们更轻松地与计算机之间进行交流和互动。随着移动互联网的…

Unity 中 TextMeshPro 字体位置偏上/偏下

问题&#xff1a;在Unity中创建了一个新的TextMeshPro 字体&#xff0c;在使用的时候布局设置的居中对齐&#xff0c;但在场景中实际位置却和预期位置不服&#xff0c;如下图。 当然通过调整布局设置&#xff0c;也可以显示成正常的效果&#xff0c;但不可能所有文本都通过这…

PRL:城大团队提出新型量子理论

光子盒研究院 近期&#xff0c;由香港城市大学&#xff08;城大&#xff09;物理学家领导的团队开发了一个新的量子理论&#xff0c;解释了物质的“光诱导阶段(light-induced phase)”&#xff0c;并预测了它的新功能。 3月初&#xff0c;研究成果以Multidimensional Coherent …

JMeter:如何开始简单的WEB压力测试?

目录 背景 如何开始简单的WEB压力测试 PutsReq网站截图 执行测试计划 背景 JMeter是一款广泛使用的性能测试工具&#xff0c;它可以模拟用户行为并生成负载&#xff0c;用于评估Web应用程序的性能和稳定性。 最近工作上被安排针对Web网站进行性能压测&#xff0c;以评估特…

点云连接 点云字段连接

什么是点云连接 点云连接指的是将两个或多个点云数据合并在一起&#xff0c;形成一个更大的点云数据集。在这个过程中&#xff0c;点云数据根据它们的坐标位置被放置在一起。具体而言&#xff0c;点云连接操作将两个点云的点按顺序合并到一个新的点云对象中。最终&#xff0c;…

CSS中伪类详解和用法例子详解

文章目录 一、伪类介绍1.伪类选择器2.动态伪类3.结构伪类4.否定伪类5.状态伪类6.目标伪类 一、伪类介绍 1.伪类选择器 动态伪类作用:link链接没有被访问前的样式效果:visited链接被访问后的样式效果:hover鼠标悬停在元素上面时的样式效果:active点击元素时的样式效果&#xf…

【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 文章目录 系列文章目录前言一、所有权(Ownership)1.1.、所有权(Ow…

【Spring Security】的RememberMe功能流程与源码详解

文章目录 前言原理 基础版搭建初始化sql依赖引入配置类验证 源码分析 进阶版集成源码分析疑问1疑问2 鉴权 升级版集成初始化sql配置类验证 源码分析鉴权流程 扩展版 前言 之前我已经写过好几篇权限认证相关的文章了&#xff0c;有想复习的同学可以查看【身份权限认证合集】。今…

[muduo学习笔记]事件分发器(Channel、Poller)

此学习笔记参考施磊老师的muduo教学课程。 目的是搞懂 muduo 网络库的核心框架。EventLoop、channel 和 Poller 之间的关系 文章目录 1 Poller 抽象基类2 Channel3 模块的包含muduo模块梳理参考&#xff1a; 整体框架如下&#xff1a; muduo是基于 Reactor 模式的网络库&#…

mmdetection调用模型训练

mmdetection调用模型训练 文章目录 mmdetection调用模型训练转化数据集格式从labelme到coco首先data导进来改一下coco.py改一下class_names.py在模型跑了之后看生成文件然后掐了包版本设置PYTHONPATHdiffustiondet模型模型训练跑完了检测模型 yolo模型yolof模型 转化数据集格式…

关系数据库SQL数据查询

关系数据库SQL数据查询 数据查询 一、单表查询 1.查询仅涉及一个表&#xff0c;选择表中的若干列 [例1] 查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student; [例2] 查询全体学生的姓名、学号、所在系。SELECT Sname,Sno,SdeptFROM Student;查询全部列 选出所有属…

Matlab评价模型--灰色关联度分析

评价模型–灰色关联度分析 灰色关联度分析 基本思想 灰色关联分析的基本思想 是根据序列曲线几何形状的相似程度来判断其联系是否紧密&#xff0c;曲线越接近&#xff0c;相应序列之间的关联度就越大&#xff0c;反之则越小。 此方法可用于 进行系统分析&#xff0c;也可应用…