如何解决获取“参数类型'小部件?'无法分配给参数类型 'Widget'" 错误
我正在尝试建立一个消费者,但我得到了这个
参数类型“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,)
],);
解决方法
典型的构建器函数如下所示:
Consumer<FooModel>(
builder: (context,model,child) {
return Text(model.foo());
}
)
但是,如果 builder
非常昂贵,则可以将其中的一部分移出构建器,并放入 child
参数中:
Consumer<FooModel>(
builder: (context,child) {
return Column(children: [
Text(model.foo()),VeryExpensiveWidget(),// this gets rebuilt every time FooModel updates
])
}
)
可以变成:
Consumer<FooModel>(
builder: (context,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。