我正在尝试建立一个消费者,但我得到了这个
<块引用>参数类型“Widget?”无法分配给参数类型“Widget”。
错误在 builder 内的子项上加下划线。 代码如下:
Consumer<Cart>(
builder: (_, cart, ch) => Badge(
child: ch,
value: cart.itemCount.toString(),
),
child: IconButton(
icon: Icon(
Icons.shopping_cart,
),
onPressed: () {},
),
),
这是它所指的徽章项目:
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,
),
),
),
)
],
);
答案 0 :(得分:0)
典型的构建器函数如下所示:
Consumer<FooModel>(
builder: (context, model, child) {
return Text(model.foo());
}
)
但是,如果 builder
非常昂贵,则可以将其中的一部分移出构建器,并放入 child
参数中:
Consumer<FooModel>(
builder: (context, model, child) {
return Column(children: [
Text(model.foo()),
VeryExpensiveWidget(), // this gets rebuilt every time FooModel updates
])
}
)
可以变成:
Consumer<FooModel>(
builder: (context, model, child) {
return Column(children: [
Text(model.foo()),
child, // this gets passed into the builder function
])
},
child: VeryExpensiveWidget(), // pass it as a child of the consumer
)
这有效地缓存了 VeryExpensiveWidget
,构建一次,然后将其用于所有未来对构建器的调用。
问题是您可能没有传入 child
。在第一个示例中,我们不需要 child 参数,这完全没问题。但是,这意味着 child
现在是 null
。因为这是允许的行为,所以 child
必须是 Widget?
在你的情况下,你总是传入一个 child
参数,所以你可以保证传入 child
的 builder
是非空的,所以使用 {{ 1}} 强制将 child!
转换为 child
您的构建器将成为:
Widget