首页 > 解决方案 > 返回小部件时未运行 Future Builder

问题描述

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

我的未来功能如下:

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 重新运行应用程序时,它会正确更新小部件。

标签: androidflutterdartfirebase-authentication

解决方案


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

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

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

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


推荐阅读