Flutter中AlertDialog编辑后无法关闭问题求助
嘿,我来帮你搞定这个对话框关不掉的问题~
首先,咱们先拆解一下这个报错的原因:你看到的Looking up a deactivated widget's ancestor is unsafe,本质是因为当你点击「Update」调用updateItemOnServer后,Firestore的实时监听会触发列表页面的Widget重建——原来打开对话框的那个IconButton所在的Widget已经被销毁了,这时候再用原来的context去执行Navigator.pop,就会尝试访问一个已经失效的Widget的祖先,自然就报错了。
接下来给你两个关键的修复点,结合起来就能解决问题:
1. 调整执行顺序:先关对话框,再更新服务器
把「关闭对话框」的操作放在「更新服务器」之前,这样对话框的关闭动作不会受到后续Widget重建的影响,因为关闭已经完成了,之后的更新触发重建也和对话框无关了。
2. 使用根导航器管理对话框
在打开对话框时指定useRootNavigator: true,并且用根导航器来执行关闭操作,这样对话框是挂载在全局的根导航器上的,不会因为父Widget的销毁而失效。
另外,你代码里还有个小bug:newName变量没有在showItemUpdateDialog函数内定义,会导致作用域问题,我也一起帮你修复了。
修复后的完整代码如下:
IconButton( icon: Icon(Icons.edit, color: Colors.white), onPressed: () { showItemUpdateDialog(context, document); } ) ....... void showItemUpdateDialog(BuildContext context, DocumentSnapshot item) { String newName = item['name']; var textController = TextEditingController(text: newName); var dialog = AlertDialog( title: Text("Item Name"), content: TextField( controller: textController, onChanged: (value) { newName = value; }, ), actions: <Widget>[ FlatButton( child: Text("Cancel"), onPressed: () { Navigator.of(context, rootNavigator: true).pop(); }, ), FlatButton( child: Text("Update"), onPressed: () { // 先关闭对话框,再执行服务器更新 Navigator.of(context, rootNavigator: true).pop(); updateItemOnServer(item, newName); }, ) ], ); showDialog( context: context, child: dialog, useRootNavigator: true, // 绑定到根导航器 ); }
这样修改之后,对话框就能正常关闭,同时服务器更新也能正常执行啦~
内容的提问来源于stack exchange,提问作者moonvader
相关产品推荐
相关产品推荐

