Flutter Widget嵌套深,修改代码麻烦?

  • 背景
  • 解决方法
  • 代码
    • 修改 pubspec.yaml 以支持 Extension:
    • Widget扩展代码:
    • 实际使用:

背景

许多人初次接触Flutter时非常不习惯,比起使用VUE开发的界面、代码、样式分离,代码清晰明了,Flutter开发的界面、代码、样式都混在一起,尤其是界面往往需要许多组件组合在一起实现,这个时候如果界面够复杂,会出现可怕的嵌套地狱,非常不利于维护。

解决方法

解决Flutter Widget地狱的方法有很多种,根据我的开发经验,着重介绍以下几种方法。

  1. 将组件转化为方法,这一种方式非常常用。
  2. 将组件转化为 StatelessWidget 或者 StatefulWidget ,我们习惯只把重复用到的组件做封装,实际上这样写更好,这个我会在后面提到。
  3. 第三种灵感来自于掘金的一篇文章《Flutter嵌套深?扩展函数了解一下》,有兴趣的朋友可以看一下。

相信很多人没注意到,dart 从2.6.0开始支持扩展函数了,也就是说我们可以给dart 类型扩展一些功能,让我们的代码更利于维护。

代码

下面是我写的两种扩展方法,主要用于参数频繁改动的页面,每个人习惯不同,你也可以把参数声明在类名开头,我更倾向于让参数和代码挨在一起,方便增删改。

修改 pubspec.yaml 以支持 Extension:

...# sdk 版本至少2.6.0
environment:sdk: '>=2.6.0 <3.0.0'...

Widget扩展代码:

import 'package:flutter/material.dart';
export 'widget_extention.dart';typedef ListPropertyCallBack = Widget Function(List<dynamic> props);
typedef MapPropertyCallBack = Widget Function(Map<String, dynamic> props);/// List to Widget
extension ListToWidgetChain on List {/// [toWidget]后接父组件Widget toWidget(ListPropertyCallBack propertyCallBack) {if (propertyCallBack != null) {return propertyCallBack(this);}return null;}
}/// Map to Widget
extension MapToWidgetChain on Map {/// [toWidget]后接父组件Widget toWidget(MapPropertyCallBack propertyCallBack) {if (propertyCallBack != null) {return propertyCallBack(this);}return null;}
}

实际使用:

import 'package:myPackage/extention/widget_extention.dart';/// List to Widget
Widget _renderItem(Map item) {return [// 名称item["name"],// 状态item["status"],// 时间item["time"]].toWidget((props) => ListView.builder(itemCount: props.length,itemBuilder: (context, index) => ListTile(leading: Icon(Icons.ac_unit),title: Text(props[0]),dense: true)));
}/// Map to Widget
Widget _renderItem2() {return {// 名称"name": "王晓阳",// 状态"status": "迟到",// 时间"time": "2020-06-22 9:56",}.toWidget((props) => ListTile(title: Text(props["name"]),subtitle: Text(props["status"]),trailing: Text(props["time"]),dense: true));
}

Flutter Widget嵌套深,修改代码麻烦?相关推荐

  1. Flutter嵌套深?扩展函数了解一下

    背景 嵌套层级深的问题让众多刚接触Flutter的同学感到困扰,它不仅是看起来让人感到不适,还非常影响编码体验. 大佬们会告诉你应该拆分自己的嵌套代码(自定义widget或者抽取build方法)来减少 ...

  2. 拆!对比详解 Flutter Widget 和 CSS,你关心的布局原理都在这儿了

    简介: 这篇文章专门对比 Flutter Widget 的布局原理和 CSS 布局原理的差异,分享在对接过程中会遇到的问题和解决方案,帮大家理一理思路,内容可以分为这几部分:1.CSS 和 Widge ...

  3. Flutter Widget详解

    Flutter Widget详解 Widget是Flutter应用程序用户界面的基本构建块.每个Widget都是用户界面一部分的不可变声明. 与其他将视图.控制器.布局和其他属性分离的框架不同,Flu ...

  4. 【Flutter】如何写一个Flutter自动打包成iOS代码模块的脚本

    相信很多使用原生+Flutter的iOS项目都会遇到混合开发的集成问题,也有大神写了一些解决方案,下面就记录一下我的心路历程: 前期准备 开始之前,我先拜读了一些大神的文章(这里只挑出对我帮助最大的) ...

  5. 修改代码的艺术----- 2.2 高层测试 2.3 测试覆盖

    2.2  高层测试 单元测试的确很棒,但高层测试也有其一席之地.所谓高层测试便是那些覆盖了某个应用中的场景和交互的测试.高层测试可以用来一下子就确定一组类的行为.能够这样做往往就意味着你可以更容易地为 ...

  6. python 列表嵌套字典 添加修改删除_【Python】列表嵌套字典修改字典里面的一个值却把全部的值都修改了。...

    具体问题就是:当我往空列表里面添加字典,需要修改其中的一个键的值的时候,出现把其他同类的值也修改了. 下面就是出现问题的代码: aliens = [] new_alien = {"color ...

  7. 盗梦空间科普札记之一:梦里乾坤嵌套深,醒来可知在哪层?

    盗梦空间科普札记之一:梦里乾坤嵌套深,醒来可知在哪层?   (唐常杰) (这是发在科学博客上一个系列博文的1/4,涉及到递归算法,第四篇涉及到图灵机停机问题,稍难一些) 上周五晚上,和几位中学生忘年交 ...

  8. 用yolo3训练自己的数据集(包含数据搜集,图片标注,图片批量命名以及如何修改代码)——口罩佩戴以及规范佩戴口罩检验

    用yolo3训练自己的数据集--口罩佩戴及规范性佩戴检验 前言 1. 数据集处理 1.1 数据搜集(多途径) 1.2 自己制作数据集 2.图片标注 2.1 图片批量命名 2.2 使用labelimg进 ...

  9. 使用vite和Element Plus,实现部署后不修改代码/打包,新增主题/皮肤包

    Web前端界面切换主题/皮肤,是一个常见的需求.如果希望在打包部署后实现皮肤的修改甚至增加皮肤,不需要修改源码或者重新打包,类似于我们常见的皮肤包扩展,又该如何实现呢? 我使用类似上一期多语言包功能中 ...

最新文章

  1. acm经典题Mark
  2. 我同事吃的辅酶Q10到底有没有效果?
  3. GoLang学习笔记——data_type
  4. go map详细使用方法
  5. [Java] 蓝桥杯ALGO-2 算法训练 最大最小公倍数
  6. ModuleNotFoundError: No module named ‘yaml‘
  7. Ueditor编辑器 .Net 版
  8. JAVA面经【来源网络转载】
  9. 在Ubuntu系统中安装字体(以安装华文行楷和方正舒体为例)
  10. HTML5 WebSockets 基础使用教程
  11. 8051单片机的C语言程序设计
  12. 玩游戏降频?跑分不行?给你的CPU降降压,提提速!
  13. 思维模型 三明治法则
  14. 2022年高教杯国赛数学建模思路分享
  15. 老干妈怒了:我才是中国第一!
  16. 计算机毕业设计(附源码)python疫情医疗物资管理系统
  17. 采用多项目共同目标 PMO的管理优势
  18. android 三星闪退,三星手机升级安卓10微信闪退怎么办?(附解决方法)
  19. 蓝桥杯——九宫重排、青蛙跳杯子
  20. 「软件」仿站小工具v9.0

热门文章

  1. 安全审计与安全管理平台的区别与联系
  2. 加快发展职业教育 让每个人都有人生出彩机会
  3. linux ps2 模拟器,PCSX2 1.0 发布,PS2 模拟器
  4. 文存阅刊杂志文存阅刊杂志社文存阅刊编辑部2023年第1期目录
  5. 单缝斜入射衍射_傅里叶变换解夫琅禾费衍射问题的几个例子_2
  6. java.io.IOException: No such file or directory之linux权限问题
  7. Ngnix配置config
  8. 基于JavaWeb+MySQL的快递驿站系统
  9. Android 心形图片心形ImageView、带边框的的心形图片和圆形图片
  10. 微信小程序 - 音乐列表点击播放 / 暂停音频,流畅切换音频(支持暂停音乐后,保留音乐 “进度“ 继续播放)最好用最详细的源码示例教程,适用于wechat列表点击后播放 mp3 wav 文件的需求