我正在嘗試基于 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 物件不為空,快照資料也為空.. 輸出:
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
uj5u.com熱心網友回復:
問題是你的_userFromFirebaseUser功能。不幸的是,您無法以async這種方式處理值。該函式在您_unicouser由 設定之前回傳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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/367001.html
上一篇:StreamBuilder:必須回傳非空值,因為回傳型別“Stream”不允許為空
下一篇:修正顫振側選單中的白色顯示
