从firestore获取集合,.map不起作用(颤动)

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

我在我的应用程序中使用 Flutter 和 firebase。

我通过将所有代码放在 main.c 中来开始我的应用程序。镖 我现在想好好整理我的文件,但我遇到了问题。

我创建了一个服务文件夹,其中包含一个数据库。 dart 文件,我在其中创建了一个类来在 firestorm 中查找我的项目

问题是我没有传入快照。文档.map ((doc))

这是我在数据库中的代码。飞镖

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutterfirebase/models/todo_model.dart';

class DatabaseService {
  DatabaseService();

  final CollectionReference itemsCollection =
      FirebaseFirestore.instance.collection("items");

  Stream<List<TodoItem>> get todos {
    return itemsCollection.snapshots().map((QuerySnapshot snapshot) {
      inspect(snapshot.docs);
      return snapshot.docs.map((DocumentSnapshot doc) {
        print('here');
        inspect(doc);
        return TodoItem(text: doc.data()['text'], done: doc.data()['done']);
      });
    });
  }
}

 print(snapshot.docs.length);
返回4。
 inspect(snapshot.docs)
可以工作,我可以用我的id看到我的4个queryDocumentSnapshot

但是

 print('here')
没有出现,
 inspect(doc)

也没有出现

你能帮我弄清楚发生了什么事吗?

这是软件包的版本

firebase_core:^1.0.2

cloud_firestore:^1.0.3

谢谢

firebase flutter google-cloud-firestore
2个回答
3
投票

我认为你应该从流中返回 QuerySnapshot 而不是 DocumentSnapshot,就像这样

Stream<List<TodoItem>> getSomeoneItems() {
  return FirebaseFirestore.instance.collection('items')
    .snapshots()
    .map((qSnap) =>
        qSnap.docs.map((doc) => TodoItem.fromJson(doc.data())).toList());
}

然后您可以在 StreamBuilder 小部件内的视图中使用此流。


0
投票

print('here')
不会出现,因为提供给
.map
的变换函数没有立即执行。
map
返回一个Iterable,并且根据官方文档

返回的iterable是惰性的,所以它不会迭代这个iterable的元素,直到它本身被迭代,然后它会应用toElement一次创建一个元素

换句话说,由于您没有迭代

map
的结果,因此
map
内部的函数永远不会被调用。强制迭代的一种方法是使用
map
方法将
toList()
的结果转换为 List。

Dartpad 中,您可以通过运行以下示例来测试:

  final List<int> numbers = [1, 2, 3];
  final iterable = numbers.map((num) {
    print('inside map, num is: $num');
    return num + 1;
  }).toList();

如果您尝试从上面的

toList()
结果中删除
map
,则永远不会执行
print

要解决原始示例,请尝试添加

toList
,如下所示:

 snapshot.docs.map((DocumentSnapshot doc) {
        print('here');
        inspect(doc);
        return TodoItem(text: doc.data()['text'], done: doc.data()['done']);
      }).toList();
© www.soinside.com 2019 - 2024. All rights reserved.