【问题标题】:Flutter conditional rendering with null-safety具有空值安全性的 Flutter 条件渲染
【发布时间】:2021-06-24 06:50:56
【问题描述】:

如果 expires 不为 null,我想呈现 Text 小部件。所以我检查了 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(),
          ),
      ],
    );
  }
}

【问题讨论】:

    标签: flutter dart dart-null-safety


    【解决方案1】:

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

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

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

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

    还可以查看此帖子中来自 cmets 的链接以获取更多信息

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

    【讨论】:

      【解决方案2】:

      您正在使用启用了 null-safety 的 Flutter。 (如果您对这个概念不熟悉,请在此处阅读 Null safety in Flutter。)

      错误似乎是在抱怨expires.day.toString() 表达式中的术语expires 可以为空,这在空安全性中是不允许的。您知道expires 不为空,因此您可以使用! 断言以防止错误,如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 小部件。

      【讨论】:

      • 如果您感兴趣,请查看下面我的回答,这些帖子描述了为什么即使我检查 null 也会出现错误
      猜你喜欢
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多