Firestore数据在检索时变得混乱-Flutter Async

时间:2019-06-14 22:34:08

标签: firebase asynchronous flutter

我正在尝试从Firestore检索数据,但是数据变得混乱了。

这些是用于检索数据的功能。函数getHomeDevices出现了问题,我将数据添加到列表mHomeDevices和deviceReferences中,因为在两个列表中,数据都是以不同顺序添加的。

Future getHomeDevices(
      String homeName, DocumentReference homeReference) async {
    if (mHomeDevices.length > 0) {
      mHomeDevices.clear();
    }

    if (deviceReferences.length > 0) {
      deviceReferences.clear();
    }

    CollectionReference devicesRef = homeReference.collection("homeDevices");
    QuerySnapshot eventsQuery = await devicesRef.getDocuments();

    final waitList = <Future<void>>[];

    for (var document in eventsQuery.documents) {
      DocumentReference deviceReference = document["deviceReference"];

      waitList.add(
        deviceReference.get().then((DocumentSnapshot ds) {
          String homeDeviceName = ds["alias"].toString();

          mHomeDevices.add(homeDeviceName);
          deviceReferences.add(deviceReference);
        }),
      );

    }

    await Future.wait(waitList);
  }

  Future getDeviceSwitches(DocumentReference device) async {

    if (switchTraits.length > 0) {
      switchTraits.clear();
    }
    CollectionReference switchesRef = device.collection("switches");

    QuerySnapshot eventsQuery = await switchesRef.getDocuments();

    eventsQuery.documents.forEach((document) {

      String trait = document["trait"];

      switchTraits.add(trait);

    });
  }

这是这些函数的调用方式:

for (int i = 0; i < mUserHomes.length; i++) {
  if (mUserHomes[i] == dropdownVal) {
    getHomeDevices(dropdownVal, homeReferences[i]).whenComplete(() {
      for(int j = 0; j<deviceReferences.length; j++) {
        getDeviceSwitches(deviceReferences[j]).whenComplete(() {
          print(switchTraits);
        });
      }
      setState(() {});
    });
  }
}

setState(() {});

在进行日志记录时,我发现mHomeDevices列表的第一个元素与deviceReferences列表的第二个元素相对应。 (此推断基于运行getDeviceSwitches函数后的日志,因为我无法直接读取Document References的值。

0 个答案:

没有答案