如何在简单的flutter-dart代码中使用对象snapshot.data实现空安全?

Posted

技术标签:

【中文标题】如何在简单的flutter-dart代码中使用对象snapshot.data实现空安全?【英文标题】:How to implement null-safety in simple flutter-dart code with object snapshot.data? 【发布时间】:2021-04-26 21:21:27 【问题描述】:

我是 Flutter/dart 编码的新手,请帮我解决以下问题:

这是我尝试从 FireStore 集合“DinnerNames”获取数据的代码,但我在该行的 snapshot.data 对象上遇到了分析错误:

itemCount:snapshot.data.documents.length

问题:

值可以为“空”的表达式必须先进行空检查,然后才能取消引用。 在取消引用之前尝试检查该值是否为“null”。

这是产生错误的代码示例:

CollectionReference dinners =
        FirebaseFirestore.instance.collection('DinnerNames');

    return Scaffold(
      appBar: AppBar(
        title: Text('My Dinner Voting App'),
      ),
      body: StreamBuilder(
          stream: dinners.snapshots(),
          builder: (context, snapshot)
            if (!snapshot.hasData) return const Text('Firestore snapshot is loading..');
            
            if (!snapshot.hasError)
              return const Text('Firestore snapshot has error..');
            
            if (snapshot.data == null)
              return const Text("Snapshot.data is null..");
            else
               return ListView.builder(
              itemExtent: 80.0,
              itemCount:  snapshot.data.documents.length,
              itemBuilder: (context, index) =>
                  _buildListItem(context, snapshot.data.documents[index]),
            ); 
                       
          
          ),
    );

这里是颤振版本:

dave@DaveMacBook-Pro firebasetest % flutter --version
Flutter 1.25.0-8.2.pre • channel beta • https://github.com/flutter/flutter.git
Framework • revision b0a2299859 (2 weeks ago) • 2021-01-05 12:34:13 -0800
Engine • revision 92ae191c17
Tools • Dart 2.12.0 (build 2.12.0-133.2.beta)

【问题讨论】:

我建议你使用 Flutter 2.2,而不是 1.25 版。 【参考方案1】:

如果您在使用对象时确定该对象不是 null,只需插入 Bang ! 运算符即可消除可空性,如下所示:

ListView.builder(
  itemCount: snapshot.data!.docs.length, // <-- Notice '!'
)

【讨论】:

【参考方案2】:

你已经在检查了:

snapshot.data == null

但似乎分析表明文档也可以为空,因此请尝试包含:

if (snapshot.data.documents != null)  ... do what you need 

或尝试更改此代码:

if (snapshot.data == null)
  return const Text("Snapshot.data is null..");

到这里:

if (snapshot.data == null || snapshot.data.documents == null)
  return const Text("Snapshot.data is null..");

【讨论】:

以上是关于如何在简单的flutter-dart代码中使用对象snapshot.data实现空安全?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - dart.ui 没有方法'platformViewRegistry'

Flutter-Dart List-Map 获取我单击的项目编号或文本?

如何在返回小部件之前遍历列表以创建地图?颤振 - 飞镖

JPA:如何避免简单地加载对象,以便将其 ID 存储在数据库中?

如何在 R 中对财务数据 xts 对象进行简单和滚动线性回归?

我如何 [简单地] 在业务线 Web 应用程序中使用 JSON 数据