从Dart 2.17开始,你可以用一种新的速记语法将构造函数参数传递给超类。
作为参考,以前的语法是这样的。
class Person {
Person(this.name);
final String name;
}
// Old way: before Dart 2.17
class Employee extends Person {
Employee(String name, this.salary) : super(name);
final int salary;
}
换句话说,你必须明确地调用super ,以便向父类构造函数传递参数。
从Dart 2.17开始,你可以这样做。
// New way: Dart 2.17 and above
class Employee extends Person {
Employee(super.name, this.salary);
final int salary;
}
这也适用于命名参数。
class Person {
Person({required this.name});
final String name;
}
// New way: Dart 2.17 and above
class Employee extends Person {
Employee({required super.name, required this.salary});
final int salary;
}
在widget构造函数中的用法
超级初始化器可以帮助我们减少许多widget类中构造函数的大小。
例如,Flutter SDK中的CircularProgressIndicator widget可以从这个升级。
class CircularProgressIndicator extends ProgressIndicator {
const CircularProgressIndicator({
Key? key,
double? value,
Color? backgroundColor,
Color? color,
Animation<Color?>? valueColor,
String? semanticsLabel,
String? semanticsValue,
}) : super(
key: key,
value: value,
backgroundColor: backgroundColor,
color: color,
valueColor: valueColor,
semanticsLabel: semanticsLabel,
semanticsValue: semanticsValue,
);
}
到这个。
class CircularProgressIndicator extends ProgressIndicator {
const CircularProgressIndicator({
super.key,
super.value,
super.backgroundColor,
super.color,
super.valueColor,
super.semanticsLabel,
super.semanticsValue,
});
}
在实践中,最常见的使用情况是使其更容易指定widget的关键。
class OrderStatusLabel extends StatelessWidget {
// before (Dart 2.16 and below)
const OrderStatusLabel({Key? key, required this.order}) : super(key: key);
// after (Dart 2.17 and above)
const OrderStatusLabel({super.key, required this.order});
final Order order;
...
}
用dart修复自动迁移
如果我们有很多预先存在的代码,手工更新所有的构造函数会很乏味。
但由于Dart团队很喜欢我们,我们可以使用dart fix 命令将我们所有的代码升级到新的语法。💙
要做到这一点,我们需要在我们的analysis_options.yaml 中添加这个额外的linter规则。
linter:
rules:
- use_super_parameters
然后我们可以使用--dry-run 标志来预览建议的修改。
dart fix --dry-run
一旦我们感到满意,我们就可以使用--apply 标志来升级我们的代码。
dart fix --apply
这真的是再简单不过了!所以,请继续升级你的代码吧。🚀
编码愉快!