firebase - 使用Flutter在Firebase中使用Stream <QuerySnapshot>检索数据

标签 firebase flutter dart google-cloud-firestore

也许这是一个新手问题,但是我正在学习动荡,异步,等待, future 之类的东西还不适合我。无论如何,我想做的是从“field.documents [index] [“name”]”中获取值并建立一个列表。这是我的代码:

String productName;

Stream<QuerySnapshot> productRef = Firestore.instance
    .collection("stores")
    .document(name)
    .collection("products")
    .snapshots();
productRef.forEach((field) {
  field.documents.asMap().forEach((index, data) {
    productName = field.documents[index]["name"];
    //IF I PRINT HERE, IT SHOWS THE PRODUCTS. 
  });
});
BUT IF I PRINT HERE, I GOT A NULL VALUE

我想在forEach之外获取productName。当我打印时,它首先打印null。我也将发布整个功能:
List mapToList({DocumentSnapshot doc, List<DocumentSnapshot> docList}) {
    if (docList != null) {
      List<Store> storeList = [];
      docList.forEach((document) {
        String name = document.data[StringConstant.nameField];
        num score = document.data[StringConstant.scoreField];
        String delivery = document.data[StringConstant.deliveryField];
        String photo = document.data[StringConstant.photoField];
        String description = document.data[StringConstant.descriptionField];
        String open = document.data[StringConstant.openField];
        String close = document.data[StringConstant.closeField];
        GeoPoint geoPoint = document.data[StringConstant.positionField]
            [StringConstant.geopointField];

        bool isOpen = document.data[StringConstant.isOpenField];
        final currentHour = DateTime.now();
        final openHour = DateTime.parse(open).hour;
        final closeHour = DateTime.parse(close).hour;
        int openMin = DateTime.parse(open).minute;
        int closeMin = DateTime.parse(close).minute;
        if (openHour <= currentHour.hour && currentHour.hour <= closeHour) {
          isOpen = true;
          if ((currentHour.hour == openHour && currentHour.minute < openMin) ||
              (currentHour.hour == closeHour &&
                  currentHour.minute > closeMin)) {
            isOpen = false;
          }
        } else {
          isOpen = false;
        }
        final double meter = distance(
          LatLng(latitude, longitude),
          LatLng(geoPoint.latitude, geoPoint.longitude),
        );

        String productName;

        Stream<QuerySnapshot> productRef = Firestore.instance
            .collection("stores")
            .document(name)
            .collection("products")
            .snapshots();
        productRef.forEach((field) {
          field.documents.asMap().forEach((index, data) {
            productName = field.documents[index]["name"];
          });
        });

        if (meter <= range && isOpen == true) {
          Store otherStore = Store(name, photo, score.toDouble(), delivery,
              meter, description, productName, 10.0, "");
          storeList.add(otherStore);
        }
      });
      return storeList;
    } else {
      return null;
    }
  }

有人可以帮我吗?我知道它与异步编程有关,但是我正在学习。谢谢!!!

最佳答案

我要做的是在这里:

List<String> productName= [];

Stream<QuerySnapshot> productRef = Firestore.instance
    .collection("stores")
    .document(name)
    .collection("products")
    .snapshots();
productRef.forEach((field) {
  field.documents.asMap().forEach((index, data) {
    productName.add(field.documents[index]["name"]);
  });
});

您可以在查询外部初始化数组,以便每次“.forEach”迭代时都可以向其中添加一个字符串。您可以做什么,而不是手动输入函数中的每个数据,而是可以创建一个数据模型以将数据库中的数据存储到本地变量中,该本地变量比手动执行field.documents ['dataField']更灵活。这是一些有用的链接:https://medium.com/flutter-community/parsing-complex-json-in-flutter-747c46655f51

关于firebase - 使用Flutter在Firebase中使用Stream <QuerySnapshot>检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58891854/

相关文章:

Flutter:发送 Http GET 请求的表单数据

android - flutter : "Could not resolve all artifacts for configuration ':类路径'“

dart - 你如何在 Dart 中运行一个交互式进程?

dart - 不断检查 Flutter 应用程序上的互联网断开连接

Jenkins :部署到火力基地。您的刷新 token 已被撤销

python - 如何初始化 google-cloud-firestore - Python

javascript - Firebase:未捕获类型错误:无法读取属性 'signInWithEmailAndPassword'

android - Firebase 数据库检索收藏夹列表

flutter - 如何在另一个组列表(groupby)中实现组列表。是否可以在dart自定义对象中使用多个哈希码和operator ==

flutter - 如何使警报对话框在抖动中工作