-1

如果过期不为空,我想呈现文本小部件。所以我检查了 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(),
          ),
      ],
    );
  }
}
4

2 回答 2

5

感谢社区的人。他显示我应该看的地方

所以这个检查不适用于类字段

分析器无法对整个应用程序的流程进行建模,因此它无法预测全局变量或类字段的值。

对于非局部变量,编译器无法轻易做出保证。非局部变量隐式地提供了 getter 函数,这些函数可以被派生类覆盖,并且可以从一次访问返回不同的值到下一次访问。

另请查看此帖子评论中的链接以获取更多信息

使用“is”的 Dart 2.1.0 智能转换不起作用

空值检查不会导致 Dart 中的类型提升

Dart null 安全性不适用于类字段

所以。如果我想使用空检查而不使用! 我应该创建本地 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(),
          ),
      ],
    );
  }
}
于 2021-03-27T18:04:44.643 回答
0

您正在使用启用了 null-safety 的 Flutter。(如果这个概念对您来说是新概念,请在此处阅读Flutter 中的 Null safety。)

该错误似乎是在抱怨在表达式expires.day.toString()中该术语expires可以为空,这在空安全性中是不允许的。你知道那expires不是空的,所以你可以断言它以防止使用!as in的错误expires!.day.toString()

请注意,在简单的 Dart 代码中,编译器会检测到非 null 的测试,并且不会报告错误,例如:

DateTime? test;
print('${test.day}');
if (test != null) {
  print('${test.day}');
}
var list = [
  test.day,
  if (test != null) test.day,
];

这里第一个和第三个打印语句有错误,第二个和第四个没有。我不知道为什么这不会进入 Text 小部件。

于 2021-03-27T17:16:13.887 回答