Проблема управления состоянием флаттера

Моя проблема связана с шаблоном / библиотекой провайдера.

Я создал несколько классов состояний следующим образом (я заменил имена содержимого / переменных, чтобы попытаться сохранить простоту)

class State1 with ChangeNotifier{

String _s;

  set s(String newS){
    _s = newS;
    notifyListeners();
  }

}

а затем я использую мультипровайдера для его передачи (создаю объекты в инициализации виджета, который действует как родительский для всего в приложении).

child: MultiProvider(
        providers: [
          ChangeNotifierProvider(builder: (context) => state1),
        ],
        child: Stack(
        alignment: Alignment.center,
        children: stackChildren,
      ),

К которому затем обращаются в методе сборки дочерних виджетов, используя

 state1Var = Provider.of<State1>(context);

И все это прекрасно работает ..

Мой вопрос, когда я получаю с помощью навигационных кнопок я больше не будет доступа государства.

onPressed: (() {
          Navigator.push(
            contextField,
            MaterialPageRoute(builder: (context) => NewPage()),
          );
        }),

Как я получаю эту ошибку

Could not find the correct Provider<State1> above this NewPage Widget...

Мне удалось получить это с помощью этого

  Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => Consumer(builder: (),child: NewPage(),)),
          );

Но когда я вытащил виджет с помощью navigator.pop (), состояние нельзя было использовать, поскольку в нем говорилось, что оно было удалено. Я делаю это неправильно или что-то упускаю?

Извините, если я усложнил это. Пришлось удалить много кода.

Спасибо за вашу помощь :)


person ebg11    schedule 14.07.2019    source источник


Ответы (1)


Возможно у вас context hierarchy проблема. Оберните свой MaterialApp мультипровайдером, иначе ваш Provider должен быть поверх того Route, внутри которого находится провайдер.

В противном случае вы можете обернуть свой Scaffold виджетом Consumer. Что делает Consumer, это просто компоновщик для установления соединения между вашим Provider и Route путем создания еще одного context и позволяет вам получить класс Provider через InheritedWidget.

person Esen Mehmet    schedule 14.07.2019
comment
Ах, у меня не было приложения для материалов с мульти-провайдером ... Большое спасибо, чувак: D - person ebg11; 14.07.2019
comment
@ ebg11, если ваша проблема решена, не забудьте закрыть тему, приняв правильный ответ: stackoverflow.com/help/someone -ответы - person Esen Mehmet; 14.07.2019
comment
У меня есть еще один вопрос, если вы не против ответить. Я хочу установить значение контроллеров редактирования текста в init (), чтобы иметь контент, который находится в одном из поставщиков. Установка этого параметра в сборке означает, что они никогда не смогут его изменить, поскольку он немедленно возвращается к тому, что находится в состоянии (он делает это, потому что я не хочу всегда обновлять состояние, когда они что-то вводят). Я использовал AfterLayoutMixin (pub.dev/packages/after_layout) в качестве решения этой проблемы (предоставляет метод переопределения, который вызывается один раз после сборки). Есть ли официальный способ сделать это или эта библиотека - хороший метод. - person ebg11; 14.07.2019
comment
@ ebg11 Я не мог понять, что именно вы хотите. Поскольку это совершенно другая проблема, вы можете открыть еще один вопрос с некоторыми кодами и лучшим объяснением. Отметьте меня в комментарии, если хотите, и я буду уведомлен. - person Esen Mehmet; 14.07.2019
comment
Хорошо, я сделаю. Я только что написал вопрос, но не могу публиковать еще 60 минут. Также для уведомления я просто делаю это @Esen Mehmet. Спасибо за вашу помощь - person ebg11; 14.07.2019
comment
Ok ive добавил вопрос. - person ebg11; 14.07.2019