Как настроить поставщиков для нескольких виджетов, не помещая поставщика в корневой виджет в flutter

#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 конструктору может потребоваться заголовок проверки подлинности перед его созданием.