如何在简单的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 存储在数据库中?