Reputation: 159
I'm trying to generate a Consumer widget but that can work for two different Providers depending on a parameter
class Header extends StatelessWidget {
const Header({
Key? key,
required this.dataProvider,
}) : super(key: key);
final IceCreamProvider dataProvider;
@override
Widget build(BuildContext context) {
return Consumer<dataProvider>(builder: (context, value, child) {
return Container();
},),
}
Of course, this code is not working, but I'm wondering if there is a way to make it work?
Upvotes: 1
Views: 865
Reputation: 1201
The generic should be the TYPE
of the variable, so in your case you have to use IceCreamProvider
and not the variable name dataProvider
Updated with the addition of HeaderWrapper
Since you want to pass the provider, you must go up one level and give your ChangeNotifierProvider
(assuming you are using that) the correct instance you want to use
class HeaderWrapper extends StatelessWidget {
const HeaderWrapper({
Key? key,
required this.dataProvider,
}) : super(key: key);
final IceCreamProvider dataProvider;
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => dataProvider,
child: Header(),
);
}
}
then inside the Header
, just use the Consumer as written before (you can even skip the field dataProvider inside since it will be not used)
class Header extends StatelessWidget {
const Header({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Consumer<IceCreamProvider>(
builder: (context, value, child) {
return Container();
},
);
}
}
Generic handling: Edit after user comment
You can't simply pass a Type as a parameter and set into the bracket as a Generic, however you can add a generic to your class
class Header<T> extends StatelessWidget {
const Header({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Consumer<T>(builder: (context, value, child) {
return Container();
});
}
}
usage:
Header<IceCreamProvider>()
Upvotes: 0