美文网首页Flutter
Dart编码:关于构造函数,这些知识点你都了解吗?

Dart编码:关于构造函数,这些知识点你都了解吗?

作者: 李小轰 | 来源:发表于2021-12-13 15:45 被阅读0次

    前言

    Flutter 和 Dart 语言都非常容易上手,很多同学在学习 flutter 时都会直接上手 flutter 页面。小轰记得刚开始 flutter 学习时,也是先大致过一遍 Dart 语法,然后对照 UI 直接堆页面。遇到不会的地方直接查 flutter 控件表。

    回顾当时的代码,真有点惨不忍睹。当时对 Dart 语言一知半解,后续,通过积累总结,代码质量也逐渐改善。下面跟大家总结一下 Dart 构造函数的 语法使用规范,方便查阅。

    构造函数类型

    Dart 构造函数有4种类型

    ClassName(...) //普通构造函数
    Classname.identifier(...) //命名构造函数
    const ClassName(...) //常量构造函数
    factroy ClassName(...) //工厂构造函数
    

    命名构造函数

    class Test {
        int x;
        //普通构造函数
        Test(this.x);
        
        //命名构造函数
        Test.origin()
        : x = 0;
    }
    

    命名构造函数不可继承,如果子类想要有 和父类一样的命名构造函数,那就写个同名的(通常会在子类的命名构造函数里,调用父类的同名命名构造函数)

    常量构造函数

    使用 const 创建常量构造方法,要求所有成员属性使用 final 修饰

    class ConstModel {
      final int paramA;
    
      const ConstModel(this.paramA);
    }
    

    当你调用多个一样参数的常量构造时,你获取的是同一个对象,从而节省内存开销和运行效率。【单例】

    工厂构造函数

    • 用法一: 工厂构造函数不需要每次构建新的实例,且不会自动生成实例,而是通过代码来决定返回的实例对象,可以把 factory 方法理解成一个中转站
    class FactoryModel {
    
      static final HashMap<String, FactoryModel> _cachedMap = HashMap<String, FactoryModel>();
    
      FactoryModel._newInstance();
    
      factory FactoryModel(String key) {
        if (_cachedMap.containsKey(key)) {
          return _cachedMap[key];
        } else {
          _cachedMap[key] = FactoryModel._newInstance();
          return _cachedMap[key];
        }
      }
    }
    
    • 用法二:用来实现单例
    class Singleton {
    
      static final Singleton _singleton = Singleton.internal();
      factory Singleton() => _singleton;
    
      Singleton.internal();
    }
    

    另外,工厂构造函数可以与命名构造函数常量构造函数结合使用

    ///常量构造函数
    const TestModule(this.x);
    
    ///工厂构造函数 + 命名构造函数
    factory TestModule.fromJson(Map map){
        ...省略
        return TestModule(map['x']);
    }
    

    构造传值:要尽可能的使用初始化形式

    ///不推荐
    class Test{
        int x;
        Test(int x)
        : x = x;
    }
    
    ///推荐
    class Test{
        int x;
        Test(this.x);
    }
    

    在构造函数中会被初始赋值的字段不要使用 late 进行修饰

    ///不推荐
    class Test{
        late int x;
        Test(int p){
            x = p + 1;
        }
    }
    
    ///推荐
    class Test{
        int x;
        Test(int p)
        : x = p + 1;
    }
    

    使用 ; 来代替空的构造函数体 {}

    ///不推荐
    class Test{
        int x;
        Test(this.x){}
    }
    
    ///推荐
    class Test{
        int x;
        Test(this.x);
    }
    

    不要使用 new

    ///推荐
    child: Text('hi')
    
    ///不推荐
    child: new Text('hi')
    

    推荐使用 final 对成员变量创建只读属性

    使用 final 修饰的字段只可赋值一次,不可更改,具有只读属性

    class Test{
        final int x;
        Test(this.x);
    }
    

    命名构造函数的继承:子类构造函数需显式调用父类的构造函数

    class Father {
        Father.fromJson(Map map){
            ...省略
        }
    }
    
    class Son extends Father {
        Son.fromJson(Map map) : super.fromJson(map) {
            ...省略
        }
    }
    

    私有构造函数

    使用_下划线进行私有声明

    class TestModule {
        //私有构造函数
        TestModule._origin();
    }
    

    相关文章

      网友评论

        本文标题:Dart编码:关于构造函数,这些知识点你都了解吗?

        本文链接:https://www.haomeiwen.com/subject/zknjfrtx.html