获取“参数类型'小部件?'无法分配给参数类型 'Widget'" 错误

时间:2021-06-01 16:00:10

标签: flutter dart widget consumer

我正在尝试建立一个消费者,但我得到了这个

<块引用>

参数类型“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,
          ),
        ),
      ),
    )
  ],
);

1 个答案:

答案 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 参数,所以你可以保证传入 childbuilder 是非空的,所以使用 {{ 1}} 强制将 child! 转换为 child

您的构建器将成为:

Widget