[英]How to implement null-safety in simple flutter-dart code with object snapshot.data?
我是 flutter/dart 編碼的新手,請幫我解決以下問題:
這是我的代碼,試圖從 FireStore 集合“DinnerNames”中獲取數據,但我在snapshot.data object 行中收到分析錯誤:
itemCount:snapshot.data.documents.length
:
問題:
其值可以為“null”的表達式必須先進行空值檢查,然后才能取消引用。 在取消引用之前嘗試檢查該值是否為“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]),
);
}
}
),
);
這是 flutter 版本:
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)
如果您確定 object 在您使用它時不是null
,只需插入 Bang !
運算符來拋棄可空性,如下所示:
ListView.builder(
itemCount: snapshot.data!.docs.length, // <-- Notice '!'
)
您已經在檢查:
snapshot.data == null
但似乎分析表明文件也可以是 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..");
}
如果您明確告訴 dart/flutter 構建器 function 中快照參數的類型將是“AsyncSnapshot<QuerySnapshot>”,您可以讓 Flutter 知道它將具有某些屬性,如下所示。 您可能仍需要使用“?”。 運算符和“文檔”現在已更改為“文檔”:
builder: (context, AsyncSnapshot<QuerySnapshot> snapshot){ // <-- here
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?.docs.length,
itemBuilder: (context, index) =>
_buildListItem(context, snapshot.data?.docs[index]),
);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.