元素类型“List<widget>”不能分配给列表类型“Widget”

新手上路,请多包涵

我正在尝试在 gridview 中使用 for 循环添加数据,但它显示了一些错误。这是我的组件代码

return new GridView.count(
    crossAxisCount: 2,
    padding: const EdgeInsets.all(10.0),
    crossAxisSpacing: 10.0,
    mainAxisSpacing: 10.0,
    children: <Widget>[getList()],
);

getList() 代码

List<Widget> getList() {
  List<Widget> childs = [];
  for (var i = 0; i < 10; i++) {
    childs.add(new ListItem('abcd ' + $i));
  }
  return childs;
}

但它显示编译时错误。

 The element type 'List<widget>' can't be assigned to the list type 'Widget'

原文由 Ravi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 840
2 个回答

在这里,您将列表包装为列表

children: <Widget>[getList()],

这应该是

children: getList(),

原文由 Günter Zöchbauer 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用扩展运算符是解决此问题的一种方法。但是还有另外一个涉及到使用 toList() 方法。

children 属性需要小部件列表。但是,在您的情况下,它变为以下内容:

 return new GridView.count(
    crossAxisCount: 2,
    padding: const EdgeInsets.all(10.0),
    crossAxisSpacing: 10.0,
    mainAxisSpacing: 10.0,
    children: [
      [
        ListItem('abcd 0'),
        ListItem('abcd 1'),
        ...
      ]
    ],
);

所以,

解决方案 1

包装应该是 children: getList(),

解决方案 2(扩展运算符)

children: <Widget>[...getList()],

附带说明一下,在尝试使用 map() 方法时,您可能会遇到此问题。在这种情况下,使用 toList() 方法就派上用场了。例如,

children: someListOfObjects.map((el) => Text(el)).toList(),

原文由 Taiyr Begeyev 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题