Flutter - Scoped BloCs проблема
У меня есть BLoC, к которому можно обращаться из любого виджета на экране, если я получаю доступ к нему как к унаследованному виджету. Однако я хочу показать диалог и использовать в нем тот же экземпляр моей модели. Когда я пытаюсь получить доступ к своей модели в качестве унаследованного виджета, я получаю нулевую ошибку. Похоже, это связано с новым экраном, использующим новый контекст.
Есть ли способ разрешить использование моей модели для дочерних экранов / диалогов без явной передачи ее в конструктор?
1 ответ
Весь смысл унаследованного виджета состоит в том, чтобы позволить вам получить к нему доступ без необходимости передавать его через конструкторы. Если вам нужно передать его, вы, вероятно, не используете его, как задумано.
Есть несколько вещей, которые нужно иметь в виду с унаследованными виджетами. Во-первых, они неизменны; Вы не можете изменить их данные. Во-вторых, прямого доступа к нему нет.
Вместо этого вы должны создать подкласс StatefulWidget в своем дереве виджетов так , чтобы он был выше в дереве, чем где бы он вам ни понадобился. Это означает, что, если он у вас есть на одной странице, а затем переместите новую страницу в навигатор, он не будет работать, поскольку они представляют собой отдельные ветви в дереве виджетов под навигатором.
Посмотрите на этот ответ для более подробного примера использования унаследованного виджета. Кроме того, проверьте пакет scoped_model - он устраняет много шаблонов, необходимых для унаследованных виджетов.
Если все, что вы делаете, это показывает диалоговое окно и затем возвращаетесь на ту же страницу, вам вообще не нужно было использовать InheritedWidget - вы могли бы просто использовать простой виджет, а затем передать его обратно. Тем не менее, без добавления некоторого кода в ваш вопрос очень трудно определить, в чем вы можете ошибаться.