MyApp({super.key})——因为一个语法糖,我研究了一晚上。
背景
心血来潮又回去看flutter,因为当初就是半桶水,连dart都没好好学。于是创建一个新项目之后,立马就把我难住了,代码该写哪儿?
过程
于是我把初始化的demo看了一下,大致回忆了一下结构,大差不差。但是看到下面这一句,我立马懵逼了。
const MyApp({super.key});
有两个疑点。
- 为什么MyApp这个构造函数不需要定义就能直接调用?
- 为什么只写了super.key而没有对应值?
我按我的理解先分析,{}看起来像一个解构的写法(js的理解),在dart中这是命名参数的写法,我认为这样设计有可能是向js靠拢(降低学习成本),因为js中如果要实现类似命名参数的效果,就会传入一个{}对象字面量。在js中,当变量名和约定的参数名相同时,可以简写为参数名(而不需要写成冒号形式)。事实上确实是类似的设计,首先就把key:key的冒号简化掉了。
我到最后都没有靠自己想通这是什么写法。
结果
从Dart 2.17版本开始,引入了“超级初始化器”(super initializer)功能。
简单来说就是引入了一个语法糖
const MyApp({super.key});
// 上面这个写法是下面写法的语法糖
const MyApp({Key? key}) : super(key: key);
这有一种为了简化写法放弃可读性的感觉,首先一个定义看起来简直和调用一样,而且根据我的直观感受,更像是将父类的key属性传给子类的构造(而实际上正好相反,优先使用子类的key参数并传给父类构造)。
设计的原因
https://medium.com/dartlang/dart-2-17-b216bfc80c5d
如图,flutter中有大量的类的构造函数需要调用父类的构造方法,并将自身的参数原模原样地传给父类构造,当存在大量参数时,就会产生大量的冗余。因此,虽然不太喜欢这种写法(主要是没见识过),要使用flutter来编写应用程序,还是有必要使用这种语法糖来简化代码编写的。


浙公网安备 33010602011771号