How to wrap navigation with blocprovider.value which inside a bloc listener

Viewed 684
 BlocConsumer<VehicleCubit, VehicleState>(
                listener: (context, state) {
                  if (state is VehicleLoaded) {
                    Navigator.of(context).push(
                      MaterialPageRoute(
                        builder: (_) {
                          final registrationNumber =
                              controller.text.trim().toUpperCase();
                          return BlocProvider.value(
                            value: BlocProvider.of<VehicleCubit>(context),
                            child: VehicleDetailsScreen(
                              registrationNumber: registrationNumber,
                            ),
                          );
                        },
                      ),
                    );
                  }
                },

                // TODO: Fix routing 
                builder: (context, state) {
                  if (state is VehicleLoading) {
                    return Center(
                      child: CircularProgressIndicator(
                        valueColor:
                            new AlwaysStoppedAnimation<Color>(brandColor),
                      ),
                    );
                  }

                  if (state is VehicleNotLoaded) {
                    toast('Unable to fetch vehicle, retry..');
                  }

                  return ElevatedButton(
                    onPressed: () {
                      FocusScope.of(context).unfocus();
                      if (controller.text.trim().isEmpty) return;

                      final registrationNumber =
                          controller.text.trim().toUpperCase();

                      BlocProvider.of<VehicleCubit>(context)
                          .fetchVehicle(registrationNumber, context);
                    },
                    child: Text(
                      'Proceed',
                      style: TextStyle(fontSize: 16),
                    ),
                    style: ButtonStyle(
                      shape: MaterialStateProperty.resolveWith(
                          (states) => RoundedRectangleBorder(
                                borderRadius: BorderRadius.circular(10.0),
                              )),
                      backgroundColor: MaterialStateProperty.resolveWith(
                          (states) => Color(0xFFE07A72)),
                    ),
                  );
                },
              )

What is wrong here? I was trying to use navigation and pass then current cubit to its children but getting errors

Here is the error:

======== Exception caught by widgets library =======================================================
The following ProviderNotFoundException was thrown building Container(bg: MaterialColor(primary value: Color(0xff2196f3)), constraints: BoxConstraints(0.0<=w<=Infinity, h=100.0)):
Error: Could not find the correct Provider<BlocBase<dynamic>> above this BlocBuilder<BlocBase<dynamic>, dynamic> 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<BlocBase<dynamic>, dynamic> is under your MultiProvider/Provider<BlocBase<dynamic>>.
  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>()),
      }
    ),
  }
  ```

If none of these solutions work, consider asking for help on StackOverflow:
https://stackoverflow.com/questions/tagged/flutter

The relevant error-causing widget was: 
  Container file:///D:/Development/FlutterDevelopment/xpcover/lib/presentation/vehicle_insurance/vehicle_details_screen.dart:38:13
```
When the exception was thrown, this was the stack: 
#0      Provider._inheritedElementOf (package:provider/src/provider.dart:332:7)
#1      Provider.of (package:provider/src/provider.dart:284:30)
#2      ReadContext.read (package:provider/src/provider.dart:610:21)
#3      _BlocBuilderBaseState.initState (package:flutter_bloc/src/bloc_builder.dart:130:36)
#4      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4632:57)
```
==================================================================================================
0 Answers
Related