正文

Dart多态控制反转编码规范实例详解(dart多态)这都可以

文章摘要

这篇文章介绍了在Flutter开发中常用的控制反转最佳实践,主要通过两种方式来实现:**通过传参构造器进行控制反转** 和 **通过继承+泛型进行解耦**。文章详细讲解了这两种方法的实现细节,并通过示例代码展示了如何通过控制反转提高代码的可维护性和复用性。文章还强调了多态和依赖注入等技术在解决参数依赖性问题中的应用。通过这些最佳实践,开发者可以更高效地构建模块化、扩展性强的Flutter应用。


目录前言举栗子方式一:通过传参构造器进行控制反转方式二:通过继承 + 泛型进行解耦

我们通常都知道程序设计要依赖抽象,提高复用性,做到对扩展开放,对修改关闭。贯彻五大原则的最重要法宝就是抽象和继承。多态是一种手段,下面,通过简单 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); } }

以上就是Dart 多态 控制反转的详细内容,更多关于Dart 多态 控制反转的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:Flutter Dart快速排序算法示例详解Flutter基于Dart Unwrapping Multiple Optional小技巧SafeList?in?Flutter?and?Dart小技巧Dart多个future队列完成加入顺序关系及原子性论证Dart?异步编程生成器及自定义类型用法详解Dart语法之变量声明与数据类型实例详解Flutter入门学习Dart语言变量及基本使用概念一文详解Dart如何实现多任务并行