Dart多态控制反转编码规范实例详解

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

前言

我们通常都知道程序设计要依赖抽象,提高复用性,做到对扩展开放,对修改关闭。贯彻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);
  }
}

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

(0)

相关推荐

  • Flutter入门学习Dart语言变量及基本使用概念

    目录 正文 变量 变量的声明赋值 变量的划分 默认值 变量的类型推断修饰符 Late变量 类型判断is和类型转换as 一些重要概念 空安全和可空类型? 表达式和语句 注释 DartPad 正文 Dart是Google发布的开源编程语言,是一种面向对象的语言.其主要应用是Flutter框架开发(Android.IOS),此外,也可以用在服务器.脚本.Web开发中.随着Flutter3.0开始支持全平台开发,Dart也可以实现桌面应用. 关于Dart的介绍不再细说.下面开始Dart的使用介绍 首先记

  • Android开发Dart Constructors构造函数使用技巧整理

    目录 参考 正文 什么是构造函数? 缺省构造函数 ー Class() 私有构造函数ー Class._() 命名构造函数ー class.Named() 私有命名构造函数ー class._Named () 工厂构造函数ー factory class Class() 参考 https://dart.dev/guides/language/language-tour#factory-constructors https://www.freecodecamp.org/news/constructors-i

  • Dart多个future队列完成加入顺序关系及原子性论证

    目录 引言 什么是 Future Future 操作具备'原子性'吗 实验写法一: 实验写法二: 实验写法三: 论证结论 引言 Dart 是一个在单线程中运行的程序.在程序中执行一个需要长时间的执行的操作,为避免卡住UI主线程,我们会用到异步(future),可以使程序在等待一个耗时操作完成时继续处理其他工作. 在进入正题之前,我们先了解一下 Dart 的消息循环机制: Dart 从两个队列执行任务:Event事件队列 和 Microtask微任务队列 事件循环会优先处理微任务队列,microt

  • Dart语法之变量声明与数据类型实例详解

    目录 前言 1.安装与使用 1.1 安装 1.2 在 vscode 中使用 2.类型声明 2.1 变量声明 2.1.1 var 2.1.2 const 和 final 2.1.3 dynamic 和 Object 2.1.4 默认值 2.2 数据类型 2.2.1 Number 2.2.2 String 2.2.4 List 2.2.5 Set 2.2.6 Map 2.2.7 Runes(字符) 2.2.8 Symbols(符号) 2.2.9 枚举类型 前言 最近在学习做 flutter 移动端开

  • Android开发Dart语言7个很酷的特点

    目录 参考 正文 Cascade 级联 Abstract 抽象类 Factory constructors 工厂建造者 Named 命名构造函数 Mixins 混合物 Typedefs Extension 扩展方法 unawaited_futures 参考 https://dart.dev/guides/language/language-tour 正文 今天的文章简短地揭示了 Dart 语言所提供的很酷的特性.更多时候,这些选项对于简单的应用程序是不必要的,但是当你想要通过简单.清晰和简洁来改

  • Dart多态控制反转编码规范实例详解

    目录 前言 举栗子 方式一:通过传参构造器进行控制反转 方式二:通过继承 + 泛型进行解耦 前言 我们通常都知道程序设计要依赖抽象,提高复用性,做到对扩展开放,对修改关闭.贯彻SOLID五大原则的最重要法宝就是抽象和继承.多态是一种手段,下面,通过简单 demo 介绍 flutter 开发中常用的最佳实践. 举栗子 /// 不推荐,避免把逻辑放在公共底层处理 class TestWidget extends StatefulWidget { const TestWidget({Key? key}

  • Android 控制ScrollView滚动的实例详解

    Android 控制ScrollView滚动的实例详解 在开发中,我们经常需要更新列表,并将列表拉倒最底部,比如发表微博,聊天界面等等, 这里有两种办法,第一种,使用scrollTo(): public static void scrollToBottom(final View scroll, final View inner) { Handler mHandler = new Handler(); mHandler.post(new Runnable() { public void run()

  • Python 格式化输出_String Formatting_控制小数点位数的实例详解

    问题概述: 有时候在使用print函数输出时,往往需要不断地切换字符串和变量,操作起来很不方便,需要不断地打引号和逗号.比如: firstName = 'Bob' lastName = 'Dylan' print('你的名字是 ', firstName, '你的姓是', lastName) 好在我们可以用%来代替变量名,最后再依次序解释每个%对应的变量是什么就可以了. firstName = 'Bob' lastName = 'Dylan' print('你的名字是%s, 你的姓是%s' % (

  • Python : turtle色彩控制实例详解

    turtle.pencolor(* args ) 返回或设置pencolor. 允许四种输入格式: pencolor() 将当前的pencolor返回为颜色规范字符串或元组(参见示例).可用作另一种颜色/ pencolor / fillcolor调用的输入. pencolor(colorstring) 设置pencolor到colorstring,这是一个Tk的颜色指定的字符串,例如"red","yellow",或"#33cc8c". penco

  • Oracle 如何规范清理v$archived_log记录实例详解

    Oracle 如何规范清理v$archived_log记录实例详解 单机实例上面,v$archived_log 很多,有上万条记录了,所以得清理一下,不然每次查询都直接滚屏幕了 SQL> select sequence#,applied from v$archived_log order by sequence# ; SEQUENCE# APPLIED .................... SEQUENCE# APPLIED ---------- --------- 9376 NO 9377

  • C++ 通过指针实现多态实例详解

     C++ 通过指针实现多态实例详解 1.父类(DBConnector) 1)DBConnector.h #include <string> using namespace std; class DBConnector { private: string name; public: DBConnector(); DBConnector(string _name); ~DBConnector(); void show(); }; 2)DBConnector.cpp #include "D

  • java 字符串反转的实例详解

    java 字符串反转的实例详解 1.new StringBuffer("abcde").reverse().toString(); 2.通过char数组进行转换, 代码如下 package com.test.reverse; public class TestReverse { public static void main(String[] args) { // 声明任意字符串 String str = "abcde"; //将字符串转换成char[] char[

  • Android原生音量控制实例详解

    本文主要涉及AudioService.还是基于5.1.1版本的代码. AudioService.java文件位于/framework/base/media/java/android/media/下. 音量控制是AudioService最重要的功能之一.先总结一下: AudioService音量管理的核心是VolumeStreamState.它保存了一个流类型所有的音量信息. VolumeStreamState保存了运行时的音量信息,而音量的生效则是在底层AudioFlinger完成的.所以进行音

  • 对Python 检查文件名是否规范的实例详解

    如下所示: # coding=utf-8 import os import os.path import re import array import cmd import pdb import pickle import tempfile import subprocess # rootPath = os.getcwd() # print rootPath rootPath = raw_input('The Check Path:') nonCheckDir = raw_input('The

  • 对python中url参数编码与解码的实例详解

    一.简介 在python中url,对于中文等非ascii码字符,需要进行参数的编码与解码. 二.关键代码 1.url编码 对字符串编码用urllib.parse包下的quote(string, safe='/', encoding=None, errors=None)方法. 对json格式的参数名和值编码,用urllib.parse包下的 urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=qu

随机推荐