Flutter Consumer<通用>?

发布于 2025-01-15 18:56:40 字数 464 浏览 1 评论 0原文

我正在尝试生成一个 Consumer 小部件,但它可以根据参数适用于两个不同的 Provider

 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();
            },),
}

当然,此代码不起作用,但我想知道是否有办法让它工作?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

朕就是辣么酷 2025-01-22 18:56:40

通用应该是变量的 TYPE ,因此在您的情况下,您必须使用 IceCreamProvider 而不是变量名称 dataProvider

Updated添加 HeaderWrapper

因为您想传递提供程序,所以您必须上升一级并为您的 ChangeNotifierProvider (假设您正在使用它)提供您想要

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(),
    );
  }
}

在内部 使用的正确实例这Header,使用之前写的Consumer即可(甚至可以跳过里面的dataProvider字段,因为不会用到)

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();
      },
    );
  }
}

通用处理:在用户评论后编辑

不能只需传递一个类型作为参数并将其作为泛型设置到括号中,但是您可以将泛型添加到您的类

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();
    });
  }
}

用法:
标头()

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文