#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(),
),
));