获取未经处理的异常:<dynamic>尝试生成源时,类型"Null"不是类型"可迭代"的子类型



我正试图从Firestore中检索一个提要,然后构建Widgets并将其呈现在封装在FutureBuilder中的ListView中。不幸的是,我一直收到这个错误:

E/flutter (20020): [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: type 'Null' is not a subtype of type 'Iterable<dynamic>'
E/flutter (20020): #0      _MomentsFeedState.getWidgetList (package:buzz/moments/moment_feed.dart:78:40)
E/flutter (20020): <asynchronous suspension>

以下是我检索数据的功能:

Stream<List<String>> getFriendUUIDS() => Firestore.friends
.doc(gameManager.myself.uuid)
.snapshots()
.map((snapshot) => ((snapshot.data()?.keys)?.toList()) ?? []);
Future<List<MomentWidget>> getWidgetList() async{
List<MomentWidget> widgetList = [];
Set<String> momentIds = Set();
await for (final uuids in getFriendUUIDS()){
for (String uuid in uuids){
DocumentSnapshot<Map<String, dynamic>> values =  await Firestore.users
.doc(uuid)
.get();
for (String momentId in values.data()?['moments']){
debugPrint('momentId: $momentId');
momentIds.add(momentId);
}
}
}

for (String momentId in momentIds){
DocumentSnapshot<Map<String, dynamic>> values = 
await Firestore.instance.collection('moments').doc(momentId).get();
Map<String, dynamic>? data = values.data()!;
String downloadURL = await storage.ref('moments/$momentId').getDownloadURL();
MomentWidget widget = MomentWidget(numLikes: data['liked_by'].length ,
location: data['location'],
date: data['timestamp'],
names: data['taggedFriends'].toString(),
shotBy: data['taken_by'], image: NetworkImage(downloadURL));
widgetList.add(widget);
}
return widgetList;
}

以及构建提要的功能:

Widget feed(){
Size size = MediaQuery.of(context).size;
return Container(
height: size.height,
width: size.width,
child: FutureBuilder(
future: getWidgetList(),
builder: (context, AsyncSnapshot<List<MomentWidget>> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Center(
child: CircularProgressIndicator(),
);
case ConnectionState.done:
if (snapshot.hasError) {
return Text(snapshot.error.toString());
} else {
return ListView.builder(
shrinkWrap: true,
scrollDirection: Axis.vertical,
itemBuilder: (context, pos) {
return snapshot.data![pos];
},
);
}
default:
return Text('Unhandled State');
}
}
),
);
}
@override
Widget build(BuildContext context) {
getWidgetList();
return Scaffold(
body: Container(
width: MediaQuery.of(context).size.width,
child: feed(),
),
);
}
}

屏幕上没有输出。我是Flutter的新手,所以我不确定我是否犯了其他类型的错误。提前感谢!

看起来moments可以为null,但没有对此进行检查。在for循环中,如果moments为null,则使用null合并运算符??默认为空列表。

它将像下面的片段:

for (String momentId in values.data()?['moments'] ?? []){
debugPrint('momentId: $momentId');
momentIds.add(momentId);
}