如何在新用户登录后获取新当前用户的文档(Flutter Firebase Firestore)

nbysray5  于 2022-11-17  发布在  Flutter
关注(0)|答案(1)|浏览(135)

我有一个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,如上图所示。我可能做错了,我解决这个问题的方法也可能是错误的?
我希望每当有人新登录时,流会更改流文档。

kx5bkwkv

kx5bkwkv1#

从代码中可以看到,

return _db
    .collection('users')
    .doc(currUser!.uid)
    .snapshots()

你特别听到的是uid的文档。
您需要关闭现有的侦听流,然后使用新用户的uid开始侦听。

相关问题