我想从 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。
我只是通过使用 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);
}