由于它是一个可选值,因此有时会为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..
}
}
答案 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