DanielRamiz
DanielRamiz

Reputation: 159

Flutter Consumer<Generic>?

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

Answers (1)

CLucera
CLucera

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

Related Questions