从第二个屏幕返回时关闭 AlertDialog 并刷新页面抖动

omb*_*iro 1 navigation dart flutter flutter-alertdialog

我有一种方法可以检查是否设置了当前用户位置,如果没有,打开一个带有两个按钮的警报对话框:取消和更新配置文件。更新配置文件按钮的 onPressed 导航到带有更新用户位置的表单的第二个屏幕。问题是:如果用户单击“更新”按钮并更新位置,则单击“后退”按钮时,将显示第一页,但警报对话框仍处于打开状态。期望:在关闭后退按钮和更新位置时,后退按钮打开第一个屏幕并刷新整个页面,获取新的位置设置。见代码:FIRST SCREEN (HOME SCREEN) @override void initState() { super.initState(); 获取用户详细信息();}

  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;
}
Run Code Online (Sandbox Code Playgroud)

第二个屏幕 - 设置屏幕带有文本字段的普通页面,用于将位置更新到 firebase。真正的问题是:如何导航回主屏幕,使用新数据刷新主屏幕并重新加载页面,从而不会打开对话框,因为一旦设置位置检查不应打开对话框。目前,即使我从对话框导航到第二个屏幕,警报对话框仍然打开,主屏幕不会用新数据刷新。

Jos*_*eve 5

尝试

  Widget updateProfileButton = FlatButton(
  child: Text("Update",
  ),
  onPressed: () async {
    Navigator.pop(context);
    await Navigator.of(context)
        .push(new MaterialPageRoute(builder: (context) => SettingsScreen()));
    setState((){});

  },
  );
Run Code Online (Sandbox Code Playgroud)