Flutter|如何在Dart 2.17中使用超级初始化器

366 阅读2分钟

从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

这真的是再简单不过了!所以,请继续升级你的代码吧。🚀

编码愉快!

参考资料