#flutter #flutter-provider #flutter-navigation
Вопрос:
Я работаю над простой демонстрацией, в которой пользователь входит в систему, видит список элементов, нажимает на элемент, а затем видит его детали. Это 3 экрана, но, скажем, два потока, где один имеет дело с логином, а другой-с предметами.
Я управляю своим состоянием с помощью provider
пакета. Я разместил LoginRepository
поставщика в своем корневом виджете, потому что это состояние необходимо везде. Это отлично работает.
Теперь мне нужен ItemRepository
файл, который должен быть доступен на ItemListScreen
и на ItemDetailScreen
. Чтобы реализовать эту область, я решил создать виджет общего предка под названием ItemScreens
. Здесь я разместил своего провайдера и свою вложенную Navigator
.
Я перемещаюсь по своим экранам с помощью Navigator.of(context)
, чтобы убедиться, что используется навигатор предков. Я использую своего провайдера Provider.of<ItemRepository>(context)
, чтобы убедиться, что используется состояние предка closes.
Это, по-видимому, не работает, потому что я получаю Could not find the correct provider
. Я понимаю, что поставщик из родственного маршрута не может быть доступен другому родному брату, но здесь я вкладываю навигаторы, я ожидал ItemRepository
бы, что они будут размещены, в ItemScreens
которых затем обрабатывается подпрограммирование, чтобы эти два маршрута могли получать поставщиков из родительского маршрута?
Боковая заметка:
В документации Flutter четко указано, что поставщики должны быть отменены для достижения надлежащего охвата. Но я никогда не видел примера, когда поставщик был поднят до некорневого виджета. Если все, что мы можем сделать, это поместить поставщиков в корневой виджет, это должно быть четко указано.
ПРАВКА: Повторное создание поставщиков на нескольких виджетах является своего рода альтернативой, но на самом деле это не область действия, а просто псевдопереход по значению.
РЕДАКТИРОВАТЬ: Размещение всех поставщиков в корневом виджете с MultiProvider
помощью не очень хорошая идея, потому что это создает глобальный анти-шаблон состояния. Некоторые состояния также просто не должны создаваться без необходимости, т. е. Пользователь посещает этот поток/экран.
Ответ №1:
Вы можете обернуть виджет MaterialApp в main.dart с помощью мультипровидера и предоставить список используемых вами поставщиков, чтобы приложение знало, к какому классу относиться как к поставщикам.
MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => FirstProvider(),
),
ChangeNotifierProvider(
create: (_) => SecondProvider(),
),
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Auro',
home: _decideMainPage(context),
// routes: routes,
theme: AllCoustomTheme.getThemeData(),
),
)
Комментарии:
1. Привет, Абхинав, добро пожаловать в сообщество и спасибо за ответ. Я бы хотел избежать размещения всех моих состояний в корневом виджете, потому что это было бы глобальное состояние, которое нежелательно. Я также не хотел бы создавать
ItemRepository
, если бы не вошел в систему. Например,ItemRepository
конструктору может потребоваться заголовок проверки подлинности перед его созданием.