在Flutter中关闭AlertDialog

moo*_*der 0 dart firebase flutter google-cloud-firestore flutter-layout

我有一个简单的Flutter应用,其中包含从Firebase数据库(Cloud Firestore)加载的项目列表。

在此处输入图片说明

如您所见-有用于添加项目的按钮,每个项目都可以删除或编辑。当我按下选定项目的编辑按钮时,出现带有TextField的AlertDialog,在此TextField中,用户可以看到当前的项目名称并进行编辑。 我仅在编辑后关闭对话框时遇到问题。

   new IconButton(
      icon: new Icon(Icons.edit, color: Colors.white),
      onPressed: (){ showItemUpdateDialog(context, document); }
   )
   .......


void showItemUpdateDialog(BuildContext context, DocumentSnapshot item) {

  String itemName = "";
  var textContoller = new TextEditingController();
  textContoller.text = item['name'];

  var dialog = new AlertDialog(
    title: new Text("item name"),
    content: new TextField(
      controller: textContoller,
      onChanged: (value) {newName = value;},
    ),
    actions: <Widget>[
      new FlatButton(
        child: Text("cancel"),
        onPressed: (){
          Navigator.pop(context);
        },
      ),
      new FlatButton(
          child: Text("Update"),
          onPressed: () { 
            updateItemOnServer(item, newName); 
            Navigator.pop(context); 
          }
      )
    ],
  );

  showDialog(context: context, child: dialog);
}
Run Code Online (Sandbox Code Playgroud)

值正在正确更新,但不会关闭AlertDialog。错误代码如下。我认为这是由于被服务器修改和更新的项目所调用。

颤动:处理手势时引发了以下断言:颤动:查找停用的窗口小部件的祖先是不安全的。flutter:此时,小部件的元素树的状态不再稳定。要安全地在其dispose()方法中引用flutter:小部件的祖先,请通过在部件的didChangeDependencies()方法中调用flutter:InheritFromWidgetOfExactType()来保存对祖先的引用。

Arn*_*rge 6

使用最新的 Flutter使用:

Navigator.of(context).pop();
Run Code Online (Sandbox Code Playgroud)

代替

Navigator.pop(context);
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它在弹出对话框时从堆栈中弹出两次

如果这能解决问题,请告诉我!


小智 5

尝试这个,

 Navigator.of(context, rootNavigator: true).pop(),
Run Code Online (Sandbox Code Playgroud)