android - 返回小部件时未运行 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 重新运行应用程序时,它会正确更新小部件。
解决方案
当您从任何其他屏幕返回时,不会调用 initstate,因为您正面临该问题。
当您从登录屏幕返回时,您可以通过以下方式调用 SetState。
Navigator.push(context, MaterialPageRoute(builder: (_) =>
Demo2())).then((value) => {
setState(() {
future_user = setUserStatus();
});
});
我不知道您的用户状态是如何变化的,所以我只是演示了当您从登录屏幕返回时如何调用某些方法或您想做的任何事情,以便您可以获取新数据。
推荐阅读
- asp.net - .NET Core 网站消耗大量内存
- excel - Excel:为什么这个条件格式公式不起作用?
- python - LSTM 单元,输入形状错误
- python - 是否可以限制在 asyncio 中同时运行的协程数量?
- r - 通过 id 和活动强度预测(总和)重塑
- regex - .htaccess 通配符子域重定向未找到通配符路径 404
- ruby-on-rails - ElasticSearch Range Aggregation 无输出结果且无错误
- android - 如何使用cordova在android手机中获取当前设置的声音
- r - 使用 R 中的新列对总和和排名进行排序和计算
- spring - Spring 的基本安全覆盖应用程序的配置