Im using shadcn_flutter
in my flutter project, it uses multiple Cubit
s and I am using get_it
to create the providers, my main.dart
file looks like this:
main.dart
import 'features/main_injection_container.dart' as di;
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.android,
);
await di.init();
runApp(
ShadcnApp(
theme: ThemeData(
colorScheme: ColorSchemes.darkNeutral(),
radius: 0.5,
),
home: const MainApp(),
),
);
}
class MainApp extends StatelessWidget {
const MainApp({super.key});
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<UserCubit>(
create: (context) => di.sl<UserCubit>(),
),
BlocProvider<AuthCubit>(
create: (context) => di.sl<AuthCubit>(),
),
BlocProvider<CredentialsCubit>(
create: (context) => di.sl<CredentialsCubit>(),
),
],
child: const SignUp(),
);
}
}
and then when i try to do Navigator.of(context).push(MaterialPageRoute(builder: (context) => Login()))
, I get the following error:
════════ Exception caught by widgets library ═══════════════════════════════════
The following ProviderNotFoundException was thrown building Login(state: _LoginState#12790):
Error: Could not find the correct Provider<CredentialsCubit> above this BlocBuilder<CredentialsCubit, CredentialsState> 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 BlocBuilder<CredentialsCubit, CredentialsState> is under your MultiProvider/Provider<CredentialsCubit>.
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>().toString()),
);
}
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, child) {
// No longer throws
return Text(context.watch<Example>().toString());
}
);
}
If none of these solutions work, consider asking for help on StackOverflow:
/questions/tagged/flutter
The relevant error-causing widget was:
Login Login:file:///Users/sami/Documents/flutter_projects/chacha_caller/lib/features/user/presentation/pages/login_signup/signup.dart:152:71
The same thing happens if I add the Login()
page in the main.dart
file and then Navigator.push()
to the SignUp()
page.