具有空安全性的颤振条件渲染

时间:2021-03-27 16:58:59

标签: flutter dart dart-null-safety

如果到期不为空,我想呈现文本小部件。所以我检查了 null

但得到了错误

enter image description here

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(),
          ),
      ],
    );
  }
}

2 个答案:

答案 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 小部件中。