網站首頁 編程語言 正文
前言
我們通常都知道程序設計要依賴抽象,提高復用性,做到對擴展開放,對修改關閉。貫徹SOLID
五大原則的最重要法寶就是抽象和繼承。多態是一種手段,下面,通過簡單 demo 介紹 flutter 開發中常用的最佳實踐。
舉栗子??
/// 不推薦,避免把邏輯放在公共底層處理 class TestWidget extends StatefulWidget { const TestWidget({Key? key}) : super(key: key); @override TestWidgetState createState() => TestWidgetState(); } class TestWidgetState extends State<TestWidget> { dynamic param; Widget childWidget = Container(); ///提供給外部調用 void update(dynamic value) { setState(() { param = value; _updateBody(); }); } void _updateBody(){ if(param == null){ childWidget = Container(); return; } switch(param.runtimeType){ case A: childWidget = AWidget(a: param as A,); break; case B: childWidget = BWidget(b: param as B,); break; default: childWidget = Container(); break; } } @override Widget build(BuildContext context) { return Container( child: childWidget, ); } }
如上的寫法是不推薦的,應該進行依賴倒置,將可變的部分放上層處理,保證底層干凈,如下:
方式一:通過傳參構造器進行控制反轉
typedef ChildBuilder = Widget Function(dynamic param); class TestWidget extends StatefulWidget { final ChildBuilder builder; const TestWidget({Key? key, required this.builder}) : super(key: key); @override TestWidgetState createState() => TestWidgetState(); } class TestWidgetState extends State<TestWidget> { dynamic param; void update(dynamic value) { setState(() { param = value; }); } @override Widget build(BuildContext context) { return Container( child: widget.builder(param), ); } } ///外部使用 TestWidget Widget _builder(dynamic param){ if (param == null) { return Container(); } switch (param.runtimeType) { case A: return AWidget( a: param as A, ); case B: return BWidget( b: param as B, ); default: return Container(); } } return TestWidget(builder: _builder);
方式二:通過繼承 + 泛型進行解耦
/// 將 TestWidget 改成抽象類并指定泛型 abstract class TestWidget<T> extends StatefulWidget { const TestWidget({Key? key}) : super(key: key); Widget childBuilder(T param); @override TestWidgetState<T> createState() => TestWidgetState<T>(); } class TestWidgetState<T> extends State<TestWidget> { T? param; Widget childWidget = Container(); void update(T value) { setState(() { param = value; }); } @override Widget build(BuildContext context) { return Container( child: widget.childBuilder(param), ); } } /// 實例A class ATestWidget extends TestWidget<A> { const ATestWidget({Key? key}) : super(key: key); @override Widget childBuilder(A param) { return AWidget(a: param); } } /// 實例B class BTestWidget extends TestWidget<B> { const BTestWidget({Key? key}) : super(key: key); @override Widget childBuilder(B param) { return BWidget(b: param); } }
原文鏈接:https://juejin.cn/post/7034024807410696199
相關推薦
- 2022-07-30 解決響應式數據依賴響應式數據無響應問題
- 2022-03-10 使用.Net6中的WebApplication打造最小API_自學過程
- 2023-04-04 Golang利用casbin實現權限驗證詳解_Golang
- 2022-06-21 Android實現登錄界面的注冊功能_Android
- 2022-10-19 為什么不要在?Flutter?中使用全局變量_Android
- 2022-08-02 python機器學習Logistic回歸原理推導_python
- 2022-04-28 C語言字符串函數介紹與模擬實現詳解_C 語言
- 2022-04-25 JQuery異步post上傳表單數據標準化模板_jquery
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支