Flutter嵌套地狱

news/2024/11/14 11:58:51/

在这里插入图片描述


@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.ppmy.cn/news/646985.html

相关文章

Android Compose UI实战练手----Google Bloom登录页

目录 1.概述2.页面展示1.1 亮色主题1.2暗色主题 3.登录页面拆分以及编码实现3.1 登录页面拆分3.2 编码实现3.2.1 LoginPage3.2.2 LoginTitle3.2.3 LoginInoutBox3.2.4 LoginHintWithUnderLine3.2.5 LoginButton 4.源码地址 1.概述 在之前的章节中我们已经介绍了如何实现Google…

人族如何TR

1。TR最重要的就是时间的选择。对方主力离家越远越好。如果见到跳科技&#xff0c;马上就去TR。一般都选择都是中前期TR。 2。造塔的位置最好呈品字型&#xff0c;中间留一定空间&#xff0c;方便农民进入。要离对方的出兵建筑近一些&#xff0c;最终目的是能够达到主基。 3。…

人族的对战宝典(LT篇)zt

vs orc:四个种族中我认为相对最好打的就是orc&#xff0c;在对战orc时我们有非常多的战术可以选择&#xff0c;首先human在lt上最大的特点当然是速矿&#xff0c;我们就先来谈谈速矿 现在出现很多观点认为人族速矿会拖慢科技。应该屏弃速矿战术&#xff0c;我却认为速矿是人族的…

星际争霸人族初学者教程

首先你得有初级知识,例如什么兵种需要什么建筑~如果这都不知道请补习补习&#xff0e; 开局-后期&#xff1a; 首先对待不同的种族之间采取不同的开局,玩t要灵活&#xff5e;不能死板&#xff0e; 对待Z 人族初期对待z效果很不错,双兵营开局很普遍.....兴奋和u-238弹是少不了&a…

实战攻防之蓝队视角下的防御体系构建

声明 本文是学习实战攻防之蓝队视角下的防御体系构建. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 蓝队应对攻击的常用策略 未知攻焉知防。如果企业安全部门不了解攻击者的攻击思路、常用手段&#xff0c;有效的防守将无从谈起。从攻击者实战视角…

袭扰战术_战术十必不可少的八

袭扰战术 In February of 2017, The Australian Signals Directorate (ASD) Australian Cyber Security Centre (ACSC) published an update to their “Top 4” Strategies to Mitigate Cyber Security Incidents by revising the list to include four more crucial strategi…

NXP i.MX 6ULL工业核心板硬件说明书( ARM Cortex-A7,主频792MHz)

1 硬件资源 创龙科技SOM-TLIMX6U是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的低成本工业级核心板&#xff0c;主频792MHz&#xff0c;通过邮票孔连接方式引出Ethernet、UART、CAN、LCD、USB等接口。核心板经过专业的PCB Layout和高低温测试验证&…

魔兽世界9.5人口最多服务器,魔兽世界最新全球服务器人口普查,国服早已不是世界第一人口大服...

原标题&#xff1a;魔兽世界最新全球服务器人口普查&#xff0c;国服早已不是世界第一人口大服 众所周知&#xff0c;魔兽世界国服在辉煌的年代玩家人口数量的非常多的&#xff0c;然而随着魔兽世界的人气日渐衰落&#xff0c;国服玩家人数也迅速下降&#xff0c;到了月卡时代更…