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 Firebase 检索不同的用户数据

如何使用 Flutter 中的 UserID 从 Firebase Firestore 检索数据?

firebase 在聊天中检索数据时的进度指示器 - Flutter

Flutter Firebase - 搜索包含字符串的文档

Flutter Firebase异步查询未在流函数中检索数据

从 Firebase 检索所有活跃用户