Flutter 获得;参数类型';Widget?&x27;can';不能分配给参数类型';小部件'&引用;错误
我试图建立一个消费者,但我得到了这个 无法将参数类型“Widget”分配给参数类型“Widget” 在生成器中的子级上加下划线时出错。 代码如下:Flutter 获得;参数类型';Widget?&x27;can';不能分配给参数类型';小部件'&引用;错误,flutter,dart,widget,consumer,Flutter,Dart,Widget,Consumer,我试图建立一个消费者,但我得到了这个 无法将参数类型“Widget”分配给参数类型“Widget” 在生成器中的子级上加下划线时出错。 代码如下: Consumer<Cart>( builder: (_, cart, ch) => Badge( child: ch, value: cart.itemCount.toString(), ), child: IconBut
Consumer<Cart>(
builder: (_, cart, ch) => Badge(
child: ch,
value: cart.itemCount.toString(),
),
child: IconButton(
icon: Icon(
Icons.shopping_cart,
),
onPressed: () {},
),
),
典型的生成器函数如下所示:
消费者(
生成器:(上下文、模型、子对象){
返回文本(model.foo());
}
)
但是,如果builder
非常昂贵,则可以将其中的一部分移出builder,并移到子参数中:
消费者(
生成器:(上下文、模型、子对象){
返回列(子项:[
Text(model.foo()),
VeryExpensiveWidget(),//每次FooModel更新时都会重新生成此文件
])
}
)
可以成为:
消费者(
生成器:(上下文、模型、子对象){
返回列(子项:[
Text(model.foo()),
child,//将其传递到生成器函数中
])
},
child:VeryExpensiveWidget(),//将其作为消费者的子级传递
)
这有效地缓存了VeryExpensiveWidget
,构建一次,然后将其用于将来对构建器的所有调用
问题是您可能无法将子项
传入。在第一个示例中,我们不需要子参数,这是完全正确的。但是,这意味着child
现在是null
。因为这是允许的行为,child
必须是一个Widget?
在您的情况下,您总是传入一个child
参数,这样您就可以保证传入builder
的child
是非空的,所以使用child是安全的
强制将子项
转换为小部件
然后,您的构建者将成为:
builder:(\uu,cart,child)=>Badge(child:child!,value:cart.itemCount.toString()),
非常感谢,它成功了
Widget build(BuildContext context) {
return Stack(
alignment: Alignment.center,
children: [
child,
Positioned(
right: 8,
top: 8,
child: Container(
padding: EdgeInsets.all(2.0),
// color: Theme.of(context).accentColor,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0),
color: Theme.of(context).accentColor,
),
constraints: BoxConstraints(
minWidth: 16,
minHeight: 16,
),
child: Text(
value,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 10,
),
),
),
)
],
);