身份验证状态更改 return 始终为空

authentication state changes return always null

我正在尝试基于 fire base 的身份验证服务创建我的用户模式流。

基于 FirebaseUser 创建用户对象:

 UnicoUser? _userFromFirebaseUser(User? user){
    if (user != null) {
      UnicoUser? _unicoUser;
      DatabaseService(uid: user.uid).getUserFromUserId().then((value){ _unicoUser = value; print("user id: "+ value.uid);});
      return _unicoUser;
    }
    return null;
    }

创建授权更改用户流:

  Stream<UnicoUser?> get unicoUser {
    return _auth.authStateChanges().map(_userFromFirebaseUser);
  }

小部件中的工具:

StreamBuilder(
          stream: AuthServices().unicoUser,
          builder: (context, AsyncSnapshot<UnicoUser?> snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting){
              return const Loading();}
            else if(snapshot.hasData ){
              return LoggedInWrapper(currentUser: snapshot.data!,);}
            else if (snapshot.hasError){
              return const Center(child: Text("Something went wrong"),);}
            else {
              print("snapshot is: "+  snapshot.data.toString());return const Authenticate();}
          },
        )

即使用户已通过身份验证且 unicouser 对象不为 null,快照数据也为 null.. 输出:

Performing hot reload...
Syncing files to device AOSP on IA Emulator...
Reloaded 0 libraries in 111ms.
I/flutter (22920): snapshot is: null
I/flutter (22920): user id: fnWyLWrCznQDSmZGr6kShpXSsK52

问题出在您的 _userFromFirebaseUser 函数上。不幸的是,您不能以这种方式处理 async 值。 _unicouser 之前的函数 returns 由 then 设置。您需要使用 async 函数和 await 结果如下:

Future<UnicoUser?> _userFromFirebaseUser(User? user) async {
  if (user != null) {
    return await DatabaseService(uid: user.uid).getUserFromUserId();
  }
  return null;
}

那么你应该可以这样使用它:

Stream<UnicoUser?> get unicoUser {
  return _auth.authStateChanges().asyncMap(_userFromFirebaseUser);
}