如何构建流控制器以侦听用于Firebase身份验证的onAuthStateChanged?

时间:2020-03-25 02:17:57

标签: firebase flutter dart firebase-authentication

这可能是一个菜鸟问题,但是我试图在Flutter中经典的Firebase身份验证流程(此处为example)的基础上添加一些功能。当用户登录/注销时,我通过下面的流获取Firebase User实例,并将其转换为应用程序的User模型。

 // auth changes user stream
Stream<User> get user {

  return _auth.onAuthStateChanged
    .map((FirebaseUser user) => User(uid: user.uid));
}

这一切都很好,但是由于Firebase用户的属性非常有限,因此我需要获取其他用户数据。我在异步Firestore查询中执行此操作,该查询返回填充了更多属性的User实例。

我的问题是我很难理解如何在上面的流之上构建流控制器,以便添加异步查询的结果,以便我的流能够填充了所有属性的用户实例可供应用程序的其余部分使用。

提前谢谢!另外,如果有人对登录后如何抓住这个额外的用户有任何建议,我很想知道最好的做法是什么:)

2 个答案:

答案 0 :(得分:0)

使用StreamTransformer

  var userTransformer = StreamTransformer<FirebaseUser, User>.fromHandlers(
    handleData: (value, sink) => sink.add(User(uid: value.uid)),
  );
Stream<User> get user {
  return _auth.onAuthStateChanged.transform(userTransformer);
}

答案 1 :(得分:0)

根据Kahou提出的建议,以下是使用StreamTransformer的解决方案:

  // create stream transformer to modify onAuthStateChanged
  StreamTransformer getOtherUserInfo() => StreamTransformer<User, User>.fromHandlers(handleData:
    (user, sink) async {
      if (user == null) {

      } else {
        User appUser = await _getUserDetailsAsync(user);
        sink.add(appUser);
      }
    }
  );

我使用_getUserDetailsAsync从Firestore获取更多用户数据...

然后我只需将StreamTransformer添加到原始流:

  // auth changes user stream
  Stream<User> get user {
    return _auth.onAuthStateChanged
      .map((FirebaseUser user) => User(uid: user.uid))
      .transform(getOtherUserInfo());
  }