Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dismissing AlertDialog in Flutter

I have simple Flutter app with list of items that are loaded from Firebase database (Cloud Firestore).

enter image description here

As you can see - there is button for adding items and each item can be deleted or edited. When I press edit button for selected item, AlertDialog with TextField appears, in this TextField user can see current item name and edit it. I have problems only with dismissing dialog after editing.

   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);
}

Value is updating correctly but AlertDialog is not dismissed. Error code is below. I think that it is due to that is was called by item that was modified and updated from server.

flutter: The following assertion was thrown while handling a gesture: flutter: Looking up a deactivated widget's ancestor is unsafe. flutter: At this point the state of the widget's element tree is no longer stable. To safely refer to a flutter: widget's ancestor in its dispose() method, save a reference to the ancestor by calling flutter: inheritFromWidgetOfExactType() in the widget's didChangeDependencies() method.

like image 943
moonvader Avatar asked Oct 15 '25 23:10

moonvader


2 Answers

Try this,

Navigator.of(context, rootNavigator: true).pop();
like image 131
Shanmugavel GK Avatar answered Oct 18 '25 17:10

Shanmugavel GK


With the latest Flutter use:

Navigator.of(context).pop();

instead of

Navigator.pop(context);

For some reason it pops twice from the stack when popping Dialog

Do let me know if this solves the problem!

like image 29
Arnold Parge Avatar answered Oct 18 '25 18:10

Arnold Parge