Как получить родительский контекст после вызова Navigator.of(context).pop()?

#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() ?