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.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 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
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 )