前言
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();
}
网友评论