Flutter возвращает Не удалось найти предка, начиная с контекста, который был передан в I/flutter

Я не могу понять, что не так с этим кодом. На этой странице есть поставщик блоков:

Widget build(BuildContext context) {
return MultiBlocProvider(
  providers: [
    BlocProvider(
      create: (BuildContext context) {
        return DatabaseBloc();
      },
    ),
    BlocProvider(
      create: (BuildContext context) {
        return QuestionholderBloc();
      },
    )
  ],`child:RaisedButton(
                  splashColor: Colors.green[600],
                  focusElevation: 50.0,
                  hoverElevation: 50.0,
                  color: Colors.green[600],
                  shape: RoundedRectangleBorder(
                      side: BorderSide(color: Colors.yellow[700]),
                      borderRadius: BorderRadius.circular(50.0)),
                  child: Text(
                    "Start",
                    style: TextStyle(fontWeight: FontWeight.bold),
                  ),
                  textColor: Colors.white70,
                  onPressed: () {
                    ExtendedNavigator.of(context)
                        .pushNamed(Routes.questionHandler);
                  }),)

извините за возможную синтаксическую ошибку. В QuestionHolderPage у меня есть:

 void didChangeDependencies() {
_statusbloc = BlocProvider.of<QuestionholderBloc>(context);
_dbbloc = BlocProvider.of<DatabaseBloc>(context);
_statusbloc.add(CheckStatus());
super.didChangeDependencies();
}

 Widget build(BuildContext context) {
return Scaffold(
  body: MultiBlocListener(
    listeners: [
      BlocListener<QuestionholderBloc, QuestionholderState>(
        listener: (context, state) {
          if (state is NoQuestions) {
            _dbbloc.add(GetQuestions());
          } else if (state is HasQuestions) {
            _statusbloc.add(GetQuestion());
          }
        },
      ),
      BlocListener<DatabaseBloc, DatabaseState>(
        listener: (context, state) {
          if (state is Loaded) {
            _statusbloc.add(SetQuestions(questionsToSet: state.questions));
          }
        },
      ),
    ],
    child: BlocBuilder<QuestionholderBloc, QuestionholderState>(
      builder: (context, state) {
        if (state is QuestionLoaded) {
          return QuestionWidget(question: state.question);
        } else {
          return CircularProgressIndicator();
        }
      },
    ),
  ),
);
}
}

Ошибка:

Ошибка: не удалось найти предка, начиная с контекста, который был передан I/flutter (4318): BlocProvider.of().


person Kiran Bhandari    schedule 16.05.2020    source источник
comment
Кажется, у вас есть символ обратной галочки в первом блоке кода (`), он выглядит неуместным. Если это просто тип здесь, а не в вашем коде, пожалуйста, исправьте его в любом случае.   -  person halfer    schedule 16.05.2020


Ответы (1)


Как видно из вашего кода, вы переходите от того места, где вы инициализируете свой MultiBlocProvider, из-за чего вы получаете эту ошибку.

Вы не можете получить доступ к провайдеру, если вы инициализируете его на одном экране и получаете к нему доступ после перехода на другой экран.

Первый способ решения.

Если вы хотите это сделать, вы можете инициализировать свой MultiBlocProvider выше виджета MaterialApp, чтобы вы могли получить доступ к каждому экрану вашего приложения.

Второй способ:

Вы можете передать все значения, к которым вы хотите получить доступ, на другом экране при навигации и инициализации нового MultiBlocProvider на этом экране.

person Viren V Varasadiya    schedule 16.05.2020
comment
Быстрый вопрос: меняется ли BuildContext при прохождении маршрутов? - person Kiran Bhandari; 16.05.2020
comment
Определенно да! - person Viren V Varasadiya; 16.05.2020
comment
Спасибо за информацию. Ценить это. - person Kiran Bhandari; 16.05.2020