【问题标题】:Named Constructor with required parameters and null safety具有必需参数和空安全性的命名构造函数
【发布时间】:2021-08-12 17:50:49
【问题描述】:

以下代码编译时不具备可靠的 null 安全性,因为可以将 null 传递给初始化非可空字段 myString 的构造函数。

class MyClass {
  String myString;
  MyClass({@required this.myString});
}

我希望在 this.myString 之后添加一个问号可以解决问题,但它并没有并且显示另一个编译错误。

默认值对我来说不是选项,似乎唯一的其他解决方案是这样的:

class MyClass {
  late String myString;
  MyClass({@required myString}) {
    this.myString = myString;
  }
}

如果有很多参数,这会降低可读性。是否有更方便的解决方案支持在命名构造函数中使用 this. 进行初始化?

【问题讨论】:

  • 使用新关键字“required”而不是“@required”。它记录在这里:dart.dev/null-safety/…
  • 没有别的办法。如果您检查任何 Flutter 小部件的内部代码,您会发现相同的模式。但是是的required 而不是@required
  • @NisanthReddy “没有其他办法”是什么意思?如果他只是将@required 替换为required,他的第一个示例就可以正常工作。
  • @julemand101 我的意思是除了用他提到的那个,没有别的办法

标签: flutter dart dart-null-safety


【解决方案1】:

对于不可为空的类型,请使用required 或提供默认值。您也可以使用late,但请确保在稍后使用它之前提供一个值。这就像一个 bang 运算符。

例子:

class Foo {
  // All are non-nullable.
  final int a;
  final int b;
  late final int c; // I trust you that you'll provide me a value later. 
  
  Foo({
    required this.a, // <-- Mark it required  
    this.b = 0, // <-- or provide a default value. 
  });
}

【讨论】:

    【解决方案2】:

    如果我没有理解错误,如果你想要一个可以从构造函数中为空的字符串参数,你可以声明一个“字符串?”输入。

    class MyClass {
      String? myString;
      MyClass({required this.myString});
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-14
      • 2020-11-08
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      相关资源
      最近更新 更多