Dart多態(tài)控制反轉(zhuǎn)編碼規(guī)范實(shí)例詳解
前言
我們通常都知道程序設(shè)計(jì)要依賴抽象,提高復(fù)用性,做到對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。貫徹SOLID
五大原則的最重要法寶就是抽象和繼承。多態(tài)是一種手段,下面,通過(guò)簡(jiǎn)單 demo 介紹 flutter 開發(fā)中常用的最佳實(shí)踐。
舉栗子??
/// 不推薦,避免把邏輯放在公共底層處理 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(); ///提供給外部調(diào)用 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, ); } }
如上的寫法是不推薦的,應(yīng)該進(jìn)行依賴倒置,將可變的部分放上層處理,保證底層干凈,如下:
方式一:通過(guò)傳參構(gòu)造器進(jìn)行控制反轉(zhuǎn)
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);
方式二:通過(guò)繼承 + 泛型進(jìn)行解耦
/// 將 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), ); } } /// 實(shí)例A class ATestWidget extends TestWidget<A> { const ATestWidget({Key? key}) : super(key: key); @override Widget childBuilder(A param) { return AWidget(a: param); } } /// 實(shí)例B class BTestWidget extends TestWidget<B> { const BTestWidget({Key? key}) : super(key: key); @override Widget childBuilder(B param) { return BWidget(b: param); } }
以上就是Dart 多態(tài) 控制反轉(zhuǎn)的詳細(xì)內(nèi)容,更多關(guān)于Dart 多態(tài) 控制反轉(zhuǎn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
谷歌Sky語(yǔ)言怎么樣?什么是Dart編程語(yǔ)言?
據(jù)外媒報(bào)道,在日前舉行Dart開發(fā)者峰會(huì)上,谷歌對(duì)外正式展示了Android最新的開發(fā)語(yǔ)言Sky,據(jù)悉,Sky本質(zhì)上就是谷歌自主的網(wǎng)頁(yè)開發(fā)語(yǔ)言Dart.2015-05-05Dart多個(gè)future隊(duì)列完成加入順序關(guān)系及原子性論證
這篇文章主要介紹了Dart多個(gè)future隊(duì)列完成加入順序關(guān)系及原子性論證,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Android開發(fā)中Dart語(yǔ)言7個(gè)很酷的特點(diǎn)
這篇文章主要為大家介紹了Android開發(fā)中Dart語(yǔ)言7個(gè)很酷的特點(diǎn)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Dart語(yǔ)法之變量聲明與數(shù)據(jù)類型實(shí)例詳解
這篇文章主要為大家介紹了Dart語(yǔ)法之變量聲明與數(shù)據(jù)類型實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Flutter學(xué)習(xí)筆記(一)配置環(huán)境
這篇文章主要介紹了Flutter學(xué)習(xí)筆記(一)配置環(huán)境,Flutter?app使用了?Dart語(yǔ)言,源自于?Google,現(xiàn)在是?ECMA?的標(biāo)準(zhǔn),需要的朋友可以參考下2023-04-04