Dart多態(tài)控制反轉(zhuǎn)編碼規(guī)范實(shí)例詳解
前言
我們通常都知道程序設(shè)計(jì)要依賴抽象,提高復(fù)用性,做到對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。貫徹SOLID五大原則的最重要法寶就是抽象和繼承。多態(tài)是一種手段,下面,通過(guò)簡(jiǎn)單 demo 介紹 flutter 開(kāi)發(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)文章
Flutter學(xué)習(xí)筆記(一)配置環(huán)境
這篇文章主要介紹了Flutter學(xué)習(xí)筆記(一)配置環(huán)境,Flutter?app使用了?Dart語(yǔ)言,源自于?Google,現(xiàn)在是?ECMA?的標(biāo)準(zhǔn),需要的朋友可以參考下2023-04-04
一文詳解Dart如何實(shí)現(xiàn)多任務(wù)并行
這篇文章主要為大家介紹了Dart如何實(shí)現(xiàn)多任務(wù)并行示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
flutter中如何使用和擴(kuò)展ThemeData實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了flutter中如何使用和擴(kuò)展ThemeData實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android開(kāi)發(fā)中Dart語(yǔ)言7個(gè)很酷的特點(diǎn)
這篇文章主要為大家介紹了Android開(kāi)發(fā)中Dart語(yǔ)言7個(gè)很酷的特點(diǎn)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Flutter學(xué)習(xí)筆記(二)創(chuàng)建一個(gè)flutter項(xiàng)目
這篇文章主要介紹了Flutter學(xué)習(xí)筆記(二)創(chuàng)建一個(gè)flutter項(xiàng)目,其中運(yùn)行的過(guò)程,可能涉及到網(wǎng)絡(luò)環(huán)境配置的問(wèn)題,需要的朋友可以參考下2023-04-04

