Dart确保类中的可选布尔值不为null

时间:2019-07-17 05:30:22

标签: class flutter dart null

由于它是一个可选值,因此有时会为null,那么如何避免它引发错误?这是唯一的方法吗?

class QText extends StatelessWidget {
  QText(this.text, this.size, [this.bold]);

  final String text;
  final double size;
  bool bold;

  @override
  Widget build(BuildContext context) {
    bold = (bold == null) ? false : bold;
    return Whatever..
  }
}

我想这样做,但是当然不起作用:

class QText extends StatelessWidget {
  QText(this.text, this.size, [this.bold]);

  final String text;
  final double size;
  final bool bold ?? false;

  @override
  Widget build(BuildContext context) {
    return Whatever..
  }
}

4 个答案:

答案 0 :(得分:3)

由于这些字段是最终字段,请尝试在构造函数初始化期间传递默认值。

还要添加一个assert语句以确保它从未初始化为null

示例:

class QText extends StatelessWidget {
  QText(this.text, this.size, [this.bold = false]) : assert(bold != null);

  final String text;
  final double size;
  final bool bold;

  @override
  Widget build(BuildContext context) {}
}

希望有帮助!

答案 1 :(得分:1)

您需要在构造函数中为变量定义默认值:

像下面这样:

QText(this.text, this.size, [this.bold = false]): assert(bold != null,"bold cannot be null.");

如果没有在bold变量中传递任何内容,则它将采用默认值false

编辑

您可以使用断言来防止用户传递null,也可以在断言失败时打印一条消息。

assert(bold != null,"bold cannot be null.")

答案 2 :(得分:1)

目前,Dart中的所有类型都可以为空。即使使用默认值,也可以有人将null作为参数显式传递。如果要绝对确定该值不是null,则必须保护所有设置该值的方法。在原始示例中,bold变量是公共变量而不是最终变量,这意味着您还必须保护设置器。

带有最终变量的示例:

class QText extends StatelessWidget {
  QText(this.text, this.size, [bool bold]) : this.bold = bold ?? false;

  final String text;
  final double size;
  final bool bold;
  ...
}

可设置bold的示例:

class QText extends StatelessWidget {
  QText(this.text, this.size, [bool bold]) : this.bold = bold ?? false;

  final String text;
  final double size;
  bool _bold;

  bool get bold => _bold;
  void set bold(bool bold) { this._bold = bold ?? false; }
  ...
}

您可以使用默认值,但它不会为您带来任何安全方面的好处。不过,它可用作文档。

答案 3 :(得分:0)

问题似乎很快就过时了,因为在这种情况下,该语言很快就会阻止null。空安全性已在开发人员通道中提供。

更多信息:https://medium.com/dartlang/announcing-sound-null-safety-defd2216a6f3