问题描述
我有一种方法可以检查是否设置了当前用户位置,如果没有,请使用两个按钮打开一个警报对话框:“取消”和“更新配置文件”。更新配置文件按钮的onpressed导航到第二个屏幕,其中包含用于更新用户位置的表单。问题是:如果用户单击“更新”按钮并更新位置,则单击“后退”按钮将显示第一页,并且警告对话框仍处于打开状态。期望:关闭后退按钮并更新位置时,后退按钮将打开第一个屏幕并刷新整个页面,从而获得新的位置设置。 参见代码:FirsT SCREEN(HOME SCREEN) @override 无效的initState(){ super.initState(); getUserDetails(); }
updateProfileLocationPrompt(BuildContext context) {
Widget cancelButton = FlatButton(
child: Text("Cancel",),onpressed: () {
Navigator.of(context).pop(true);
},);
Widget updateProfileButton = FlatButton(
child: Text("Update",onpressed: () {
Navigator.of(context)
.push(new MaterialPageRoute(builder: (context) => SettingsScreen()));
},);
AlertDialog alert = AlertDialog(
title: Text("Update location",content: Text(
"Please Update you location",actions: [
cancelButton,updateProfileButton,],);
// show the dialog
showDialog(
context: context,builder: (BuildContext context) {
return alert;
},);
}
getUserDetails() async {
var firebaseUser = FirebaseAuth.instance.currentUser;
DocumentSnapshot value = await FirebaseFirestore.instance
.collection(Str.USERS)
.doc(firebaseUser.uid)
.get();
if (value.data()[Str.ADDRESS].toString() == null ||
value.data()[Str.ADDRESS].toString() == "") {
return updateProfileAndLocationPrompt(context);
} else {
setState(() {
searchLocationAddress = value.data()[Str.ADDRESS].toString();//got from firebase
getItems();
});
}
return;
}
第二屏幕-设置屏幕 带有文本字段的常规页面,用于将位置更新到Firebase。 真正的问题是:如何导航回到主屏幕,用新数据刷新主屏幕并重新加载页面,因此不能打开对话框,因为一旦设置位置检查就不会打开对话框。 当前,即使我从对话框导航到第二个屏幕,警报对话框仍处于打开状态,主屏幕也不会刷新新数据。
解决方法
尝试
Widget updateProfileButton = FlatButton(
child: Text("Update",),onPressed: () async {
Navigator.pop(context);
await Navigator.of(context)
.push(new MaterialPageRoute(builder: (context) => SettingsScreen()));
setState((){});
},);
,
如果您想关闭警报对话框,那么当他们导航到下一个屏幕时,应该弹出。要在单击后重新构建主屏幕,可以使用回调,因此一旦按下后退按钮,它将触发在主屏幕中声明的回调。
主屏幕
void rebuildPage() {
setState(() {});
}
onPressed: () {
Navigator.pop(context);
Navigator.of(context)
.push(new MaterialPageRoute(builder: (context) => SettingsScreen(onPressed: rebuildPage)));
},
设置屏幕
final Function onPressed;
SettingsScreen({ this.onPressed });
AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_back),onPressed: () {
Navigator.pop(context);
onPressed();
},)
),