I got an error when learning bloc in flutter
Error is Error: Could not find the correct Provider above this Practice4HomePage Widget
This happens because you used a BuildContext
that does not include the provider
of your choice. There are a few common scenarios:
You added a new provider in your main.dart
and performed a hot-reload.
To fix, perform a hot-restart.
The provider you are trying to read is in a different route.
Providers are "scoped". So if you insert of provider inside a route, then other routes will not be able to access that provider.
You used a BuildContext
that is an ancestor of the provider you are trying to read.
Make sure that Practice4HomePage is under your MultiProvider/Provider. This usually happens when you are creating a provider and trying to read it immediately.
For example, instead of:
Widget build(BuildContext context) {
return Provider<Example>(
create: (_) => Example(),
// Will throw a ProviderNotFoundError, because `context` is associated
// to the widget that is the parent of `Provider<Example>`
child: Text(context.watch<Example>()),
),
}
consider using builder
like so:
Widget build(BuildContext context) {
return Provider<Example>(
create: (_) => Example(),
// we use `builder` to obtain a new `BuildContext` that has access to the provider
builder: (context) {
// No longer throws
return Text(context.watch<Example>()),
}
),
}
You have to provide the bloc to your Practice4HomePage
class. One way is to provide the bloc to the entire widget tree i.e. wrapping MaterialApp
with BlocProvider
or MultiBlocProvider
. Another way is to wrap BlocProvider
which you are calling Practice4HomePage
. So let's suppose you are navigating from the ABC page to Practice4HomePage
, you can wrap BlocProvider
inside your navigation statement.
Example:
Navigator.of(context).push(
MaterialPageRoute<HomeForm>(
builder: (context) => BlocProvider<TimerState>(
create: (context) => TimerState(),
child: Practice4HomePage(),
),
),
),