【问题标题】:Convert FirebaseUser to a customized User class in a Stream将 FirebaseUser 转换为 Stream 中的自定义 User 类
【发布时间】:2020-08-12 02:33:52
【问题描述】:

我想通过在使用 Firebase 作为后端的 Flutter 项目中添加一些额外的字段来将 FirebaseUser 转换为自定义类。这是我的代码:

Stream<User> get user {
// return _auth.onAuthStateChanged.map(_fromFirebaseUser);

final theUser = _auth.onAuthStateChanged.map((firebaseUser) {
  final result = Firestore.instance.collection("users")
    .document(firebaseUser.uid).snapshots().map((snapshot) { 
       return User(
         uid: user.uid,
         name: snapshot.data['name'],
         email: user.email,
         age: snapshot.data['age'],
         gender: snapshot.data['gender'] 
      );
   }
   return result;
  });
  return theUser;
}

基本思想是我将从用户集合中获取数据并填充用户模型。但我收到以下错误消息:

参数类型“Stream”不能分配给参数类型“Stream”。

需要关于如何返回 Stream&lt;User&gt; 而不是 Stream&lt;Stream&lt;User&gt;&gt; 的建议。谢谢。

【问题讨论】:

    标签: firebase flutter google-cloud-firestore firebase-authentication


    【解决方案1】:

    在本例中,您使用 2 个流:_auth.onAuthStateChangedFirestore.instance.collection("users").document(firebaseUser.uid).snapshots()。您需要将其组合起来,或者简单地从集合中异步获取用户文档,而不是监听流:

    Stream<User> get user {
      return _auth.onAuthStateChanged.asyncMap((firebaseUser) async {
        final snapshot = await Firestore.instance
            .collection("users")
            .document(firebaseUser.uid)
            .get();
        return User(
            uid: firebaseUser.uid,
            name: snapshot.data['name'],
            email: firebaseUser.email,
            age: snapshot.data['age'],
            gender: snapshot.data['gender'] 
        );
      });
    }
    

    注意使用asyncMap 而不是map 以允许异步文档获取。

    【讨论】:

    • 当firestore用户发生变化时,这个用户流如何更新?因为这个流只监听 auth 的变化,而不是 firestore 的变化
    • @Karen 如果你也想监听用户更新,你需要结合这两个流
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 2020-12-31
    • 2013-04-01
    • 2016-11-16
    • 1970-01-01
    相关资源
    最近更新 更多