【问题标题】:Future Builder not running when returning to widget返回小部件时未运行 Future Builder
【发布时间】:2020-08-16 22:40:33
【问题描述】:

我正在运行具有 Firebase 身份验证的 FutureBuilder。我期待颤振在 FutureBuilder 内部检查用户登录的状态。如果用户登录到要显示的小部件应该是一个logout 图标。如果用户已注销,则要显示的小部件应为 login

我对 Future 的作用如下:

Future<String> setUserStatus()

async {

userStatus = await FirebaseAuth.instance.currentUser();


uid = userStatus.uid;

print('after the query - The user is $uid after');

if(uid == null){

  return uid = null;

} else if( uid != null){

  return uid = userStatus.uid;
}

}

我的未来建设者如下:

FutureBuilder<String>(

future: future_user, 
builder: (BuildContext context,  snapshot) {

  String update_status = snapshot.data;

if(update_status == null){
return //Widget for login
}

else if(update_status != null){
return //widget for logout
}

如果我单击注销按钮,这可以正常工作。小部件正确更新,并为用户提供现在登录的选项。注销的功能是:

Future<String> logout() async {
await FirebaseAuth.instance.signOut();
setState(() {
  future_user = setUserStatus();
});

}

问题是当我登录时,用户被带到一个单独的登录页面。登录后,当我导航回运行 FutureBuider 的主页时,它没有获取用户的 uid(返回 null)并且仍然显示 login 图标。我在 initState 中调用 Future Builder,所以当我返回时它不应该运行它吗?

Future<String> future_user;

@override
void initState() {
super.initState();
setState(() {
  future_user = setUserStatus();

});

}

当我从 Android Studio 重新运行应用程序时,它会正确更新小部件。

【问题讨论】:

    标签: android flutter dart firebase-authentication


    【解决方案1】:

    当您从任何其他屏幕返回时,不会调用 initstate,因为您正面临该问题。

    您可以通过以下方式从登录屏幕返回时调用 SetState。

     Navigator.push(context, MaterialPageRoute(builder: (_) => 
        Demo2())).then((value) => {
          setState(() {
               future_user = setUserStatus();
            });
        });
    

    我不知道你的用户状态是如何变化的,所以我只是演示了当你从登录屏幕返回时如何调用一些方法或你想做的任何事情,以便你可以获取新数据。

    【讨论】:

    • 将我的 setState 放入登录页面的 Navigator 没有意义,因为它位于单独的 dart 文件中,而 future user 不是全局变量。
    • 如果您的数据不在同一个文件中,那么您可能正在使用状态管理系统,如果该函数负责更改状态,则可以调用 setUserStatus 函数,然后您可以执行 setstate。
    • 另外,我没有使用 Navigator 导航到主页。我只使用手机上的返回按钮
    • 无论您如何导航回来,如果您从任何其他屏幕返回,方法 aways 调用都无关紧要。
    • 谢谢!我现在试了一下,效果很好!仍在尝试围绕 Flutter 上的状态管理进行思考,在 Navigator.push 函数中输入 setState 似乎很奇怪。
    【解决方案2】:

    您可以在点击下面的登录按钮时使用以下方法调用..

    _navigateAndDisplaySelection(BuildContext context) async {
      final result = await Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => LoginScreen()),
      );
    
      // After the Selection Screen returns a result, hide any previous snackbars
      // and show the new result.
         setState(() {
      future_user = result;
    
    });
    }
    

    请在登录页面使用WillPopScope小部件,当您点击登录页面时,成功登录后直接重定向到主页。

    在登录按钮 OnPressed 事件中使用 Navigator.pop(context,_loggedInStatus);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 2023-01-14
      • 2020-07-15
      • 2021-01-18
      • 1970-01-01
      • 2021-08-13
      • 2021-02-19
      相关资源
      最近更新 更多