Can't seem to workout why my BlocProvider is failing

Viewed 46

I am re writing Reso Coder's TDD clean architecture course with some minor changes. End goal is to have the exact same content with latest version of flutter with updated libraries & also to have the option of Riverpod state managment. But while using flutter_bloc I can't seem to make it work.

BlocProvider buildBody({required BuildContext context}){
    return BlocProvider(
      create: (context) => sl<NumberTriviaBloc>(),
      child: Center(
        child: Padding(
          padding: const EdgeInsets.all(10.0),
          child: Column(
            children: [
              SizedBox(height: 20.0,),
              Container(
                  margin: EdgeInsets.all(5),
                  height: MediaQuery.of(context).size.height/2.5,
                  child: Placeholder()
              ),
              SizedBox(height: 20.0,),
              Column(
                children: [
                  Placeholder(fallbackHeight: 50),
                  SizedBox(height: 25),
                  Row(
                    children: [
                      Expanded(child: Placeholder(fallbackHeight: 30)),
                      SizedBox(width: 10),
                      Expanded(child: Placeholder(fallbackHeight: 30),),
                    ],
                  )
                ],
              )

            ],
          ),
        ),
      ),
    ) ;
  }

the above code seems to work fine without any errors.

But as soon as I introduce BlocBuilder (snippet given below), I get

Error: Could not find the correct Provider<NumberTriviaBloc> above this BlocBuilder<NumberTriviaBloc, NumberTriviaState> Widget

BlocProvider buildBody({required BuildContext context}){
    return BlocProvider(
      create: (context) => sl<NumberTriviaBloc>(),
      child: Center(
        child: Padding(
          padding: const EdgeInsets.all(10.0),
          child: Column(
            children: [
              SizedBox(height: 20.0,),
              //start of the problem
              BlocBuilder<NumberTriviaBloc, NumberTriviaState>(
                  builder: (context, state) {
                    if (state is Empty) {
                      return Text("1");
                    }else{
                      return Text("2");
                    }
                  }
              ),
              //end of the problem
              Container(
                  margin: EdgeInsets.all(5),
                  height: MediaQuery.of(context).size.height/2.5,
                  child: Placeholder()
              ),
              SizedBox(height: 20.0,),
              Column(
                children: [
                  Placeholder(fallbackHeight: 50),
                  SizedBox(height: 25),
                  Row(
                    children: [
                      Expanded(child: Placeholder(fallbackHeight: 30)),
                      SizedBox(width: 10),
                      Expanded(child: Placeholder(fallbackHeight: 30),),
                    ],
                  )
                ],
              )

            ],
          ),
        ),
      ),
    ) ;
  }

I have read everything I could get my hands on from the internet, still cant seem to figure it out. Any help would be much appreciated.

Full code available at here & Dependecy injection logic available here

2 Answers

You have to pass the bloc to BlocBuilder as well.

bloc: sl<NumberTriviaBloc>(),

Just add this to your BlocBuilder and you're good to go.

Try wrapping your Center() widget with Builder() to get BlocProvider's context instead of context passed to buildBody method which doesn't have BlocProvider as parent.

return BlocProvider(
  create: (context) => sl<NumberTriviaBloc>(),
  child: Builder(
    builder: (context) => Center(...),//Wrap with Builder 
  ),
);
Related