我有一个firestore数据库,其中包含“users”集合,文档id是用户的帐户uid。文档包含如下信息:姓名、电子邮件和地址。目前,我有一个流媒体提供程序,可以流式传输用户的文档,但当我注销并登录到其他帐户时,文档信息仍然是前一个用户的文档。
我的streamprovider用来创建流的类。
class UserModel {
final FirebaseFirestore _db = FirebaseFirestore.instance;
final FirebaseAuth _auth = FirebaseAuth.instance;
//Stream the current user's information.
Stream<Map<String, dynamic>> getCurrentUserMap() {
User? currUser = _auth.currentUser;
return _db
.collection('users')
.doc(currUser!.uid)
.snapshots()
.map((docSnap) {
return docSnap.data()!;
});
}
}
例如,我登录到bigfella@gmail.com,它会将bigfella的文档作为Map,并将其打印到控制台。然后我注销并登录到burger@gmail.com,但它仍然会打印出bigfella的文档。我在firestore上手动修改了bigfella的文档,我的代码对此做出了React。因此,我的问题是idk如何使流更改为在新用户登录后监听他们的文档。
StreamProvider<Map<String, dynamic>>(
create: (context) => UserModel().getCurrentUserMap(),
initialData: const {},
),
我试着阅读文档,发现authStateChanges、idTokenChanges和userChanges流会将当前用户返回到它们的侦听器,我试着这样使用authStateChanges:
Stream<Map<String, dynamic>> getCurrentUserMap() {
Stream<User?> currUserStream =
_auth.authStateChanges().map((user) => (user != null) ? user : null);
User? currUser;
StreamSubscription<User?> currUserSub = currUserStream.listen((event) {
User? currUser = event;
});
return _db
.collection('users')
.doc(currUser!.uid)
.snapshots()
.map((docSnap) {
return docSnap.data()!;
});
}
考虑到它没有工作,我真的不知道我在做什么,我可能做错了。
我也在想,也许在提供商创建流之后,就这样了?它不能把那个流改变成不同的流?我不确定。
任何提示都会很有帮助。
我尝试使用另一个streamprovider和authstatechanges将currentuser流传输到将返回当前用户文档流的函数,但是我在该类中没有上下文可监听。
我试图直接在类中使用authStateChanges/userChanges,如上图所示。我可能做错了,我解决这个问题的方法也可能是错误的?
我希望每当有人新登录时,流会更改流文档。
1条答案
按热度按时间kx5bkwkv1#
从代码中可以看到,
你特别听到的是
uid
的文档。您需要关闭现有的侦听流,然后使用新用户的
uid
开始侦听。