我正在尝试生成一个消费者小部件,但是根据参数的不同,这可以适用于两个不同的提供者
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();
},),
}当然,这段代码不起作用,但我想知道是否有办法让它工作?
发布于 2022-03-21 16:37:49
泛型应该是变量的TYPE,因此在您的示例中,您必须使用IceCreamProvider而不是变量名称dataProvider。
更新后添加了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内部,使用前面编写的“消费者”(您甚至可以跳过字段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();
},
);
}
}泛型处理:在用户注释之后进行编辑
不能简单地将Type作为参数传递并作为泛型设置到括号中,但是可以将泛型添加到类中
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();
});
}
}用法: Header<IceCreamProvider>()
https://stackoverflow.com/questions/71559988
复制相似问题