颤振版本:1.89+
我有一个自定义函数如下:
Future<List<CustomListItems>> getPrevChats() async {
List<CustomListItems> vList = [];
final Stream<QuerySnapshot<Map<String, dynamic>>> chatsRef =
FirebaseFirestore.instance.collection("AT").snapshots();
chatsRef.forEach((data) {
for (var doc in data.docs) {
vList.add(CustomListItems(doc.data()['message'], doc.data()['author']));
}
int i = vList.length;
print("Inside loop count : $i");
});
int i = vList.length;
print("Final : $i");
return vList;
}
为了测试值,我暂时嵌入了打印列表长度。现在,当我从 main 调用这个函数时:
List<CustomListItems> vList1;
try {
vList1 = await DBMethods().getPrevChats();
} catch (e) {
print(e.toString());
}
输出显示: 最终:0 内循环计数:4
但是,期望两个输出均为 4。
我尝试根据一个简单直接的示例重现您的问题:
List<String> getLetters() {
List<String> letters = [];
final dummyStrings = ["Foo", "Bar", "Hello", "World"];
dummyStrings.forEach((element) {
for (var letter in element.split("").toList()) {
letters.add(letter);
}
int i = letters.length;
print("inside: $i");
});
int i = letters.length;
print("outside: $i");
return letters;
}
输出是(如预期):
内:3 内部:6 内:11 内部:16 室外:16
这使得
foreach
的行为变得清晰。
然而,这里的技巧是,在这个例子中,我们知道代码正在被执行同步,而你的代码中并非如此!
您发布的输出显示“Final:0”正在被打印甚至在“Inside Loop count:4”之前,这不是预期的结果。它表明您的代码正在运行异步。
解决方案:getPrevChats()
声明为
async
,但似乎你在调用
await
时忘记添加
FirebaseFirestore.instance.collection("AT").snapshots()
:
final Stream<QuerySnapshot<Map<String, dynamic>>> chatsRef =
await FirebaseFirestore.instance.collection("AT").snapshots();