从第二个屏幕导航回来并刷新页面颤动时关闭 AlertDialog

Posted

技术标签:

【中文标题】从第二个屏幕导航回来并刷新页面颤动时关闭 AlertDialog【英文标题】:Close AlertDialog on Navigating back from second screen and refresh page flutter 【发布时间】:2020-12-20 15:01:22 【问题描述】:

我有一个方法可以检查当前用户的位置是否设置,如果没有,打开一个带有两个按钮的警报对话框:取消和更新配置文件。更新配置文件按钮的 onPressed 导航到第二个屏幕,其中包含更新用户位置的表单。问题是:如果用户单击“更新”按钮并更新位置,则在单击“返回”按钮时,会显示第一页,但警报对话框仍处于打开状态。期望:在关闭返回按钮和更新位置时,返回按钮打开第一个屏幕并刷新整个页面,获得新的位置设置。 见代码:第一个屏幕(主屏幕) @覆盖 无效初始化状态() 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;

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

【问题讨论】:

【参考方案1】:

试试

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

  ,
  );

【讨论】:

这似乎有效:单击返回时对话框被关闭,主屏幕未刷新,因此再次检查是否设置了位置。如果第二个屏幕已更新,这将更新主屏幕,然后刷新将获取最新数据。 这似乎有效:已编辑 - 自动更新主屏幕上的第二个屏幕上的更改(对 firestore 数据库所做的更改)并重新渲染主屏幕,我在 firestore 上使用了一个侦听器变化,它工作得很好。太感谢了。你拯救了这一天。【参考方案2】:

如果你想关闭警告对话框,那么当他们导航到下一个屏幕时,你应该从它pop。要在单击返回后重建主屏幕,您可以使用回调,因此一旦您按下返回按钮,它将触发主屏幕中声明的回调。

主屏幕

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();
          ,
        )
      ),

【讨论】:

以上是关于从第二个屏幕导航回来并刷新页面颤动时关闭 AlertDialog的主要内容,如果未能解决你的问题,请参考以下文章

在颤动中使用 StreamBuilder 时将数据传递到下一个屏幕

如何从第二个标签窗口打开第一个标签窗口的网址页面?

移动到其他页面时无法保持底部导航栏颤动

如何防止导航器推送刷新屏幕

如何打开一个新表单然后从第二个表单返回到第一个表单而不关闭并重新打开第一个表单

当我停止使用功能播放歌曲并更改导航栏索引时,颤动的音乐继续播放