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

6

由于它是一个可选值,因此有时它将为空,那么我如何避免其抛出错误?这是唯一的方法吗?

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个回答

10

在字段最终确定时,尝试通过构造函数初始化传递默认值。

还要添加一个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) {}
}

希望这能帮到你!


不要在生产环境中使用assert,因为它会被忽略:https://dart.dev/guides/language/language-tour#assert - Heikkisorsa

4

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

使用final变量的示例:

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

  final String text;
  final double size;
  final bool 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; }
  ...
}

你可以使用默认值,但这不会增加任何安全性。不过,它可以作为文档来使用。


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.")

真的吗?所以你可以像在Javascript中一样做到这一点。太酷了。不知道为什么我甚至都没有尝试过,哈哈。 - Hasen
1
这并不阻止调用者明确地将 null 作为参数传递。 - jamesdlin
更新的答案。 - ibhavikmakwana

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接