#flutter
#трепетание
Вопрос:
Как получить правильный контекст после вызова Navigator.of(context).pop()
?
Пример:
ElevatedButton(
child: Text('Test'),
onPressed: () {
Navigator.of(context).pop();
showLoadingDialog(context);
})
Это, по showLoadingDialog
сути, обертка showDialog
вызова, для которой требуется context
. Но в моем понимании контекст изменен для вызова Navigator.of(context).pop()
. Причина , по которой мне нужно позвонить pop()
, заключается в том , что это ElevatedButton
на a SimpleDialog
, и его нужно закрыть вызовом pop()
.
Во время тестирования этот пример выдает ошибки:
E/flutter ( 6989): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe.
E/flutter ( 6989): At this point the state of the widget's element tree is no longer stable.
E/flutter ( 6989): 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.
Прочитав некоторые документы и использовав их в своем проекте, я все еще не могу полностью понять контекст. Любая помощь приветствуется, спасибо!
Ответ №1:
Что вы должны помнить, так это то, что представления помещаются в стек. Поэтому, когда вы вызываете Navigator.of(context).pop() , он удаляет ваше текущее представление и возвращает вас к предыдущему. Попробуйте обернуть навигатор в виджет, и это может решить вашу проблему.
Комментарии:
1. Спасибо за совет. Иногда вам нужно использовать builder, чтобы обернуть дочерний виджет, чтобы предоставить соответствующий
context
дочернему, и я знаю, как это сделать. Не могли бы вы привести несколько примеров кодов о том, как обернуть его после вызова pop(), пожалуйста? Спасибо!
Ответ №2:
Я решил это в своем собственном случае: потому showDialog
что нужен строитель, который делает новый context
. Дайте ему другое имя, например ‘contextOfDialog’, измените приведенные выше коды на
ElevatedButton(
child: Text('Test'),
onPressed: () {
Navigator.of(contextOfDialog).pop();
showLoadingDialog(context);
})
И это будет работать должным образом. Поскольку context
вызывается правильный после pop()
.
По сути, мое решение заключается в передаче родительского context
элемента в качестве параметра. Однако вопрос все еще остается: когда у вас есть доступ только к текущему context
, как получить родительский context
контекст после pop()
?