Невозможно удалить AlertDialog из ящика

#flutter #dart

#flutter #dart

Вопрос:

Я пытаюсь showDialog при нажатии элемента on drawer :

 ListTile(
      title: Text('Home'),
      leading: Icon(Icons.home_outlined),
      onTap: () {
        Navigator.pop(context);
        showDialog(
            context: context,
            child: AlertDialog(
              title: Text('Confirm Sign out'),
              content: Text('Are  sure to sign out from app now?'),
              actions: [
                FlatButton(
                  onPressed: () {
                    Navigator.pop(context);
                  },
                  child: Text('Cancel'),
                ),
              ],
            ));
      },
    ),
  

Полный код drawer виджета:

 class HomeDrawer extends StatelessWidget {
@override
Widget build(BuildContext context) {
  return Drawer(
    // your widgets goes here
    child: Column(
    crossAxisAlignment: CrossAxisAlignment.start,
  children: [
    ListTile(
      title: Text('Notifications'),
      leading: Icon(Icons.notifications_outlined),
      onTap: () {},
      selected: true,
    ),
    Divider(),
    ListTile(
      title: Text('Logout'),
      leading: Icon(Icons.logout),
      onTap: () {
        Navigator.pop(context);
        showDialog(
            context: context,
            child: AlertDialog(
              title: Text('Confirm Sign out'),
              content: Text('Are  sure to sign out from app now?'),
              actions: [
                FlatButton(
                  onPressed: () {
                    Navigator.pop(context);
                  },
                  child: Text('Cancel'),
                ),
                FlatButton(
                  onPressed: () async {
                    await FirebaseAuth.instance.signOut();
                  },
                  child: Text('Yes and Confirm'),
                )
              ],
            ));
      },
    ), //here is a divider
    Spacer(),
  ],
));
}
 }
  

Но dilaog он не отключается и показывает следующую ошибку:

 Looking up a deactivated widget's ancestor is unsafe.

At this point the state of the widget's element tree is no longer stable.

To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.

When the exception was thrown, this was the stack: 
#0      Element._debugCheckStateIsActiveForAncestorLookup.<anonymous closure> (package:flutter/src/widgets/framework.dart:3906:9)
#1      Element._debugCheckStateIsActiveForAncestorLookup (package:flutter/src/widgets/framework.dart:3920:6)
#2      Element.findAncestorStateOfType (package:flutter/src/widgets/framework.dart:4039:12)
#3      Navigator.of (package:flutter/src/widgets/navigator.dart:2218:40)
#4      Navigator.pop (package:flutter/src/widgets/navigator.dart:2107:15)
...
Handler: "onTap"
Recognizer: TapGestureRecognizer#016ce
  debugOwner: GestureDetector
  state: possible
  won arena
  finalPosition: Offset(140.5, 462.5)
  finalLocalPosition: Offset(9.5, 34.0)
  button: 1
  sent tap down
  

Комментарии:

1. Я не получаю никаких исключений при отмене диалога, не могли бы вы показать больше кода, например, какой контекст вы используете?

2. я только что отредактировал код

Ответ №1:

Удалить Navigator.pop(context) из onTap ,

Почему это не работает?

Потому что при этом текущий виджет будет удален из дерева виджетов, поэтому после этого контекст текущего виджета также будет недоступен.

 onTap: () {
           Navigator.pop(context); // Remove this to pop from here
          // Rest code 
       }
  

Ответ №2:

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

это работает для меня