Flutter:关于检索 Firebase 用户 ID 的异步函数的问题
Posted
技术标签:
【中文标题】Flutter:关于检索 Firebase 用户 ID 的异步函数的问题【英文标题】:Flutter: Question about async function to retrieve Firebase user ID 【发布时间】:2019-04-01 15:55:10 【问题描述】:App Flowchart
我对 Flutter 中的异步函数有疑问。我写了一个使用 Firebase 身份验证的。我想让应用程序在初始化状态函数处读取应用程序顶层(在本例中为根页面)的 Firebase 用户 ID,然后将用户对象传递给其子小部件。由于检索用户 ID 的函数是异步函数,因此我遇到了问题,即子小部件获取用户 ID 的空值,即使它不应该为空。我已经在子小部件中使用了未来的构建器,但它不起作用。有谁知道如何正确地做到这一点。
我得到的确切错误是“构建函数返回 null。有问题的小部件是:FutureBuilder。构建函数绝不能返回 null。”
根页面(父) 类 _RootPageState 扩展状态
AuthStatus authStatus = AuthStatus.notSignIn;
String cuerrentUserId;
@override
void initState()
super.initState();
widget.auth.currentUser().then((userId)
setState(()
authStatus = userId == null ? AuthStatus.notSignIn : AuthStatus.signIn;
cuerrentUserId = userId;
);
);
@override
Widget build(BuildContext context)
return new Scaffold(
body: new FutureBuilder<FirebaseUser>(
future: FirebaseAuth.instance.currentUser(),
builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot)
switch(authStatus)
case AuthStatus.notSignIn:
return new LoginPage(
auth: new Auth(),
onSignedIn: _signedIn,
);
case AuthStatus.signIn:
if (snapshot.connectionState == ConnectionState.done)
return new HomePage(
auth: widget.auth,
onSignedOut: _signedOut,
userId: snapshot.data.uid,
);
else
),
);
主页(子)
Future<String> setUserData() async
currentUser = User(widget.userId);
await currentUser.loadUserData();
_userName = currentUser.name;
_userEmail = currentUser.email;
_userPicURL = currentUser.avatar;
print('current user');
print(currentUser.id);
print(currentUser.email);
return _userName;
@override
Widget build(BuildContext context)
return UserProvider(
user: currentUser,
child: new Container(
child: new FutureBuilder(
future: setUserData(),
builder: (BuildContext context, AsyncSnapshot<String> snapshot)
if (snapshot.data!=null)
...
【问题讨论】:
***.com/a/52344225/10269042 【参考方案1】:您可以使您的主要功能异步,以便在应用启动期间决定是否应将登录或主页显示为第一个屏幕。
这可能如下所示:
Future<void> main() async
FirebaseUser currentUser = await FirebaseAuth.instance.currentUser();
bool showHomePage = currentUser != null;
runApp(MyApp(showHomePage));
您现在可以使用MyApp
中的showHomePage
参数来确定最初应该显示哪个屏幕。就是这样。
奖励:使用这种方法,您也不需要显示一个屏幕一秒钟的摩擦,这可能会被另一个屏幕替换(例如显示主屏幕 --> 用户未登录 --> 替换为登录屏幕)。这可能看起来像是您的应用程序中的一个小故障。
【讨论】:
感谢 Frederik,让主函数异步解决了问题,但我不太明白为什么。你介意解释一下吗?以上是关于Flutter:关于检索 Firebase 用户 ID 的异步函数的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Flutter 中的 UserID 从 Firebase Firestore 检索数据?
firebase 在聊天中检索数据时的进度指示器 - Flutter