moonvader
moonvader

Reputation: 21081

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.

Upvotes: 3

Views: 12965

Answers (3)

Viren V Varasadiya
Viren V Varasadiya

Reputation: 27137

Try This,

Navigator.popUntil(context, ModalRoute.withName('/login'));

Upvotes: 1

Shanmugavel GK
Shanmugavel GK

Reputation: 368

Try this,

 Navigator.of(context, rootNavigator: true).pop(),

Upvotes: 13

Arnold Parge
Arnold Parge

Reputation: 6867

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!

Upvotes: 6

Related Questions