如果到期不为空,我想呈现文本小部件。所以我检查了 null
但得到了错误
class TileButton extends StatelessWidget {
final DateTime? expires;
const TileButton({
Key? key,
this.expires,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Row(
children: [
Text(
'Hello Flutter',
),
if (expires != null)
Text(
expires.day.toString(),
),
],
);
}
}
答案 0 :(得分:2)
感谢来自社区的人。他告诉我应该看哪里
因此此检查不适用于类字段
<块引用>分析器无法对整个应用程序的流程进行建模,因此无法预测全局变量或类字段的值。
<块引用>对于非局部变量,编译器无法轻易做出保证。非局部变量隐式地提供了 getter 函数,这些函数可以被派生类覆盖,并且可以从一次访问到下一次访问返回不同的值。
另请查看此帖子评论中的链接以获取更多信息
Dart 2.1.0 smart cast using 'is' not working
Null check doesn't cause type promotion in Dart
Dart null safety doesn't work with class fields
所以。如果我想使用空检查而不使用 ! 我应该创建本地 var final _expires = expires; 并使用 _expires 进行检查
class TileButton extends StatelessWidget {
final DateTime? expires;
const TileButton({
Key? key,
this.expires,
}) : super(key: key);
@override
Widget build(BuildContext context) {
final _expires = expires;
return Row(
children: [
Text(
'Hello Flutter',
),
if (_expires != null)
Text(
_expires.day.toString(),
),
],
);
}
}
答案 1 :(得分:0)
您正在使用启用了空安全的 Flutter。 (如果您对这个概念不熟悉,请在此处阅读Null safety in Flutter。)
错误似乎是在抱怨表达式 expires.day.toString()
中的术语 expires
可以为空,这在空安全中是不允许的。您知道 expires
不为空,因此您可以像在 !
中那样使用 expires!.day.toString()
断言以防止错误。
注意在简单的Dart代码中,编译器检测非空的测试,不会报错,例如:
DateTime? test;
print('${test.day}');
if (test != null) {
print('${test.day}');
}
var list = [
test.day,
if (test != null) test.day,
];
这里第一个和第三个打印语句有错误,第二个和第四个没有。我不知道为什么这没有贯彻到 Text 小部件中。