从第二个屏幕导航回来并关闭页面刷新时,关闭AlertDialog 主屏幕设置屏幕

问题描述

我有一种方法可以检查是否设置了当前用户位置,如果没有,请使用两个按钮打开一个警报对话框:“取消”和“更新配置文件”。更新配置文件按钮的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();
          },)
      ),

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...