如何在flutter中提取THEN的返回值?

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

我想从 Stream 函数内的两个不同用户集合中返回一个用户。现在,我需要提取来自 .then((value) => ... ) 的值,以便我可以返回它。 在下面的代码中,始终返回 null,因为我无法使用 then 内部的值 then 之外的值。

  Stream? getCurrentUser(String uid) {
    final adminRef = firebaseFirestore!.collection(FirebaseConst.admins).doc(uid).get();
    adminRef.then((value){
      if(value.exists){
        final adminsCollection = firebaseFirestore!.collection(FirebaseConst.admins).where("uid", isEqualTo: uid).limit(1);
        return adminsCollection.snapshots().map((querySnapshot) => querySnapshot.docs.map((e) => AdminrModel.fromSnapshot(e)).toList().first);
      }else if (!value.exists){
        final usersCollection = firebaseFirestore!.collection(FirebaseConst.users).where("uid", isEqualTo: uid).limit(1);
        return usersCollection.snapshots().map((querySnapshot) => querySnapshot.docs.map((e) => UserModel.fromSnapshot(e)).toList().first);
      }
    });
    return null;
  }

我尝试使用 async/await 但它不适用于 Streams。

flutter dart future
1个回答
0
投票

我只是通过使用 async* 和 Yield* @Richard Heab 来解决问题

  Stream? getCurrentUser(String uid) async* {
final adminRef = await firebaseFirestore!.collection(FirebaseConst.admins).doc(uid).get();
if(adminRef.exists){
      final adminsCollection = firebaseFirestore!.collection(FirebaseConst.admins).where("uid", isEqualTo: uid).limit(1);
      yield* adminsCollection.snapshots().map((querySnapshot) => querySnapshot.docs.map((e) => AdminModel.fromSnapshot(e)).toList().first);
}
    final usersCollection = firebaseFirestore!.collection(FirebaseConst.users).where("uid", isEqualTo: uid).limit(1);
    yield* usersCollection.snapshots().map((querySnapshot) => querySnapshot.docs.map((e) => UserModel.fromSnapshot(e)).toList().first);

}

© www.soinside.com 2019 - 2024. All rights reserved.