Как заставить работать Провайдер и Навигатор?

Я использую Provider для управления состоянием и для отдельной бизнес-логики от пользовательского интерфейса.

Я поставил несколько Provider над MaterialApp, чтобы получить доступ ко всему приложению (например, к информации о пользователе).

Но вы не хотите поместите ChangeNotifierProvider выше, чем необходимо (потому что вы не хотите загрязнять область видимости).

Поэтому я пытаюсь добавить несколько Provider, которые используются только на некоторых страницах ниже в дереве виджетов.

Например, в моем потоке товаров я могу иметь: SelectItemPage => ConfirmItemPage => CheckOutPage.

Но моя проблема в том, что Navigator.push() каждый раз создавать отдельное дерево виджетов. Поэтому, если я инициализирую Provider в SelectItemPage, к нему нельзя будет получить доступ в ConfirmItemPage или CheckOutPage.

Я хочу, чтобы Provider входил в область действия этого потока, но я не понимаю, как это сделать.

Как я могу это решить? Или мой подход неверен?

Изменить: я знаю, что могу использовать бурение опорой для прохода данных из SelectItemPage => ConfirmItemPage => CheckOutPage, но это сложно поддерживать. Я хочу использовать Provider вместо бурения.


person FlutterFirebase    schedule 11.09.2019    source источник
comment
Помогает ли это: dev.to/shakib609/? Где каждая вкладка получает список на основе действий пользователя. Также состояние managemnet и Navigation не должны влиять друг на друга.   -  person skjagini    schedule 12.09.2019
comment
@skjagini Спасибо за ответ! Но ваша статья не поможет. Он просто инициализирует Provider в верхней части дерева виджетов. Я хочу, чтобы инициализация была ниже, а доступ ниже даже после навигации.   -  person FlutterFirebase    schedule 13.09.2019
comment
Если вам нужно по страницам, вам нужен корневой уровень. Если вам не нравится, как организован код, вы можете проверить реализацию Redux, но, опять же, другого варианта нет.   -  person skjagini    schedule 13.09.2019


Ответы (1)


Я думаю, что другого пути нет, вы просто инициализируете провайдера для каждого класса

попробуйте использовать это в своем приложении

в вашем главном приложении

MultiProvider(
      providers: ChangeNotifierProvider<yourstate>(
          builder: (context) => yourstate,
        ),
child: MaterialApp...

на каждой странице вы можете инициализировать, используя приведенный ниже код

final state = Provider.of<yourstate>(context);

и используйте это, если вы не хотите слышать какое-либо изменение состояния

final state = Provider.of<yourstate>(context, listen: false);
person Robby Rahmana    schedule 12.09.2019
comment
Спасибо за ответ! Но разве это не загрязнение? - person FlutterFirebase; 12.09.2019