I have a list of cards. When I tap a card, the BoxViewPage opens.
If I use Hero and Multiprovider together, I get an error,
but,
if I use Hero and MultiProvider individually everything works correctly
Why?
List of Cards:
    return Hero(
      tag: box.ID,
      child: InkWell(
        child: selectBoxSize(viewType),
        onTap: () async {
          Navigator.of(context).push(
            MaterialPageRoute(
              builder: (BuildContext context) => MultiProvider(
                providers: [
                  ChangeNotifierProvider<Archive>.value(value: archive),
                  ChangeNotifierProvider<Box>.value(value: box),
                ],
                builder: (context, child) => BoxViewPage(),
              ),
            ),
Inside BoxViewPage:
class BoxCardView extends StatefulWidget {
  const BoxCardView({Key key}) : super(key: key);
  @override
  _BoxCardViewState createState() => _BoxCardViewState();
}
class _BoxCardViewState extends State<BoxCardView> {
  @override
  Widget build(BuildContext context) {
    final box = Provider.of<Box>(context);
    return Hero(
      tag: box.ID,
      child: Card(
        clipBehavior: Clip.antiAlias,
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(12.0),
        ),
        margin: EdgeInsets.all(12),
        child: Column(
          children: <Widget>[
            Expanded(child: WidgetEditPhotosScrollHoriz()),
            WidgetNameDescrTagsEdit(),
          ],
        ),
      ),
    );
  }
}
Error:
Si è verificata un'eccezione ProviderNotFoundException (Error: Could not find the correct Provider above this WidgetEditPhotosScrollHoriz 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.dartand 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
BuildContextthat is an ancestor of the provider you are trying to read.Make sure that WidgetEditPhotosScrollHoriz 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
builderlike 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 )