Dart多態(tài)控制反轉編碼規(guī)范實例詳解
更新時間:2022年11月16日 08:42:57 作者:李小轟_Rex
這篇文章主要為大家介紹了Dart多態(tài)控制反轉編碼規(guī)范實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
前言
我們通常都知道程序設計要依賴抽象,提高復用性,做到對擴展開放,對修改關閉。貫徹SOLID
五大原則的最重要法寶就是抽象和繼承。多態(tài)是一種手段,下面,通過簡單 demo 介紹 flutter 開發(fā)中常用的最佳實踐。
舉栗子??
/// 不推薦,避免把邏輯放在公共底層處理 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); } }
以上就是Dart 多態(tài) 控制反轉的詳細內容,更多關于Dart 多態(tài) 控制反轉的資料請關注腳本之家其它相關文章!