关闭关于从第二个屏幕导航回来的 AlertDialog 并刷新页面抖动
Close AlertDialog on Navigating back from second screen and refresh page flutter
我有一个方法可以检查当前用户的位置是否已设置,如果没有,打开一个带有两个按钮的警告对话框:取消和更新配置文件。更新配置文件按钮的 onPressed 导航到第二个屏幕,其中包含用于更新用户位置的表单。问题是:如果用户单击“更新”按钮并更新位置,则在单击“后退”按钮时,将显示第一页,同时警告对话框仍处于打开状态。预期:关闭后退按钮并更新位置时,后退按钮会打开第一个屏幕并刷新整个页面,获得新的位置设置。
见代码: FIRST SCREEN (HOME SCREEN)
@覆盖
无效初始化状态(){
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();
},
)
),
我有一个方法可以检查当前用户的位置是否已设置,如果没有,打开一个带有两个按钮的警告对话框:取消和更新配置文件。更新配置文件按钮的 onPressed 导航到第二个屏幕,其中包含用于更新用户位置的表单。问题是:如果用户单击“更新”按钮并更新位置,则在单击“后退”按钮时,将显示第一页,同时警告对话框仍处于打开状态。预期:关闭后退按钮并更新位置时,后退按钮会打开第一个屏幕并刷新整个页面,获得新的位置设置。 见代码: FIRST SCREEN (HOME SCREEN) @覆盖 无效初始化状态(){ 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();
},
)
),