Почему использование класса provider выдает ошибку после перехода к следующему экрану после navigator.push()?

#flutter #flutter-provider

#flutter #flutter-provider

Вопрос:

Итак, я недавно узнал, что если мы не используем виджет приложения provider выше Material, то, если мы попытаемся получить доступ к значению provider после выполнения Navigator.push(), он выдаст исключение :

 Unhandled Exception: Error: Could not find the correct Provider above this Consumer Widget
 

Я узнал, что когда мы используем Navigator.push() , он изменяет маршрут, и, следовательно, текущий виджет не принадлежит дереву поставщика. Но мы также передаем контекст сборки текущего виджета Navigator.push(context,(_) => NewWidget()) слишком правильно?

Так разве этот переданный контекст не используется в новом виджете, созданном после Navigator.push()? В информации, предоставленной после ошибки, указано, что виджет должен использовать некоторый контекст источника поставщика. Итак, если я удовлетворяю этому условию, то почему я все еще получаю эту ошибку?

Заранее спасибо за ответ 🙂

Ответ №1:

context используется здесь, чтобы найти ближайший экземпляр Navigator здесь. Это сокращение для Navigator.of(context).push(route) .

context можно рассматривать как позицию в дереве виджетов. Provider.of(context) вернет ближайшего поставщика выше заданной context позиции.

При нажатии маршрута MaterialApp виджет поменяет дерево местами. Вы можете думать об этом как о виджете маршрута, который становится прямым дочерним элементом MaterialApp . Итак, над вашим виджетом маршрута есть a MaterialApp , а затем ничего… Итак, он не может найти поставщика.

Поэтому вам нужно обернуть свои виджеты маршрута другим поставщиком.

 Navigator.of(context).push(MaterialPageRoute(
  builder: (BuildContext context) => Provider<Something>(
    create: ...,
    child: MyPage(),
  ),
));