有没有办法利用初始化式列表来optionally初始化可选的 构造函数中的参数?下面的示例求助于if(?x)类型 主体中的逻辑,因为不清楚如何仅在初始化列表中设置_x 如果它被传入的话.

class Point { 
    double _x = 0.0;
    double get x => _x;
    double _y = 0.0;
    double get y => _y;

    Point(
        {
        double x,
        double y
        })
    { 
        if(?x) { _x = x; }
        if(?y) { _y = y; }
    }
}

另一种 Select 是让构造函数:

Point(
      {
        double x: 0.0,
        double y: 0.0
      }) : _x = x, _y = y
{
}

但是你在重复你自己(0.0多个地方),看起来x和y被初始化了两次,一次是为成员初始化,然后又被初始化列表初始化.此外,成员初始值设定项的一个好处是,它可以是函数调用,而默认参数的默认值似乎需要常量.我希望/意识到对性能的影响很小.只是想要一个很好的规范化方法,很可能用于代码生成.

推荐答案

对于常量来说,Chris Buckett's answer是很棒的. 显然,有一个三元运算符可以在Member中工作 初始化器.因此,如果一个字段的初始化代价很高(比方说 需要函数调用和/或创建对象),此方法似乎有效:

  • 不必费心初始化类中的成员-更喜欢 构造函数.否则,可能会白费力气.
  • 跳过NICE this.member参数语法.而是使用成员名称和 使分配中具有this.个成员的成员获得资格.
  • Make use of the ?parm with ternary operator in member initializer. Here is an example in which creating the default values for the member is assumed expensive.
class Formats {
  static Map<String, dynamic> defaultFormats() {
    print("Expensive call - avoid if possible");
    return {"th": 'default th', "td": 'default td'};
  }

  Map<String, dynamic> leftTbl;
  Map<String, dynamic> rightTbl;

  Formats(
      {Map<String, dynamic>? leftTbl,
      Map<String, dynamic>? rightTbl})
      : leftTbl = leftTbl ?? defaultFormats(),
        rightTbl = rightTbl ?? defaultFormats();

  @override
  String toString() {
    return """
l => $leftTbl,
r => $rightTbl
""";
  }
}

示例用法:

print(new Formats());
print(new Formats(leftTbl: {"th":'solid #089', "td":'solid #089' }));
print(new Formats(leftTbl: {"th":'solid #189', "td":'solid #189'},
      rightTbl: {"th":'solid #189', "td":'solid #189'}));

输出:

Expensive call - avoid if possible
Expensive call - avoid if possible
l => {th: default th, td: default td},
r => {th: default th, td: default td}

Expensive call - avoid if possible
l => {th: solid #089, td: solid #089},
r => {th: default th, td: default td}

l => {th: solid #189, td: solid #189},
r => {th: solid #189, td: solid #189}

Dart相关问答推荐

为什么在穷举switch 表达式中需要显式向下转换?

如何找到这个Currate函数的返回类型?

Flutter|Dart 创建匿名类

如何防止多行文本小部件放置在行中时被剪裁?

Flutter:Firebase FieldValue.serverTimestamp() 到 DateTime 对象

ProcessException:进程C:\..\myapp\android\gradlew.bat异常退出:

如何解决此Cannot enable MyLocation layer as location permissions are not granted?

Dart / Flutter 错误:没有为类Logger定义toStringDeep

访问用户环境变量

找不到名为split-per-abi的选项

Flutter Text 小部件中的 StrutStyle 是什么

为什么这个文件会自动创建自己 generate_plugin_registrant.dart

在小部件构建期间,如何在Flutter中导航?

将Dart嵌入到应用程序中

Dart:默认 gitignore?

如何判断 Dart NNBD 中的泛型类型是否可以为空?

Cancel stream onData

Dart,对泛型的限制?

函数调用前的感叹号是什么意思?

了解工厂构造函数代码示例