我有一种方法可以检查是否设置了当前用户位置,如果没有,请使用两个按钮打开一个警报对话框:“取消”和“更新配置文件”。更新配置文件按钮的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。 真正的问题是:如何导航回到主屏幕,用新数据刷新主屏幕并重新加载页面,因此不能打开对话框,因为一旦设置位置检查就不会打开对话框。 当前,即使我从对话框导航到第二个屏幕,警报对话框仍处于打开状态,主屏幕也不会刷新新数据。
答案 0 :(得分:1)
尝试
Widget updateProfileButton = FlatButton(
child: Text("Update",
),
onPressed: () async {
Navigator.pop(context);
await Navigator.of(context)
.push(new MaterialPageRoute(builder: (context) => SettingsScreen()));
setState((){});
},
);
答案 1 :(得分:0)
如果您想关闭警报对话框,那么当他们导航到下一个屏幕时,应该弹出。要在单击后重新构建主屏幕,可以使用回调,因此一旦按下后退按钮,它将触发在主屏幕中声明的回调。
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();
},
)
),