Flutter Dart - Foreach 行为此处不清楚

问题描述 投票:0回答:1

颤振版本: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。

flutter dart foreach
1个回答
0
投票

我尝试根据一个简单直接的示例重现您的问题:

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();
    
© www.soinside.com 2019 - 2024. All rights reserved.