#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();
это работает для меня