我正在尝试使用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'
答案 0 :(得分:17)
在这里,你将列表包装为列表
children: <Widget>[getList()],
这应该是
children: getList(),
答案 1 :(得分:3)
使用展开运算符是解决此问题的一种方法。但还有另一种涉及使用 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(),
答案 2 :(得分:2)
只需使用传播运算符:
return new GridView.count(
crossAxisCount: 2,
padding: const EdgeInsets.all(10.0),
crossAxisSpacing: 10.0,
mainAxisSpacing: 10.0,
children: <Widget>[...getList()],
);
答案 3 :(得分:1)
我发现有两种方法可行。
方法1-简单
flutter
的最新版本支持此方法
var list = ["one", "two", "three", "four"];
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
for(var item in list ) Text(item)
],
),
方法2-有点复杂
在Flutter 1.12.13+hotfix.7
和Dart 2.7.0
中进行了测试,我们可以如下遍历对象列表:
遍历对象列表
...data.map((f) => paragraph(f.title, f.description)).toList(),
自定义窗口小部件
Column paragraph(String title, String description) {
return new Column(
children: <Widget>[
Container(
child: Text(title),
),
Container(
child: Text(description),
),
],
);
}
数据:对象列表
List<AboutUsData> data = [
new AboutUsData(
title: 'Our Vision',
description:
'OUR VISION',
),
new AboutUsData(
title: 'Our Mission',
description:
'OUR MISSION',
),
new AboutUsData(
title: 'Our Values',
description:
'As we grow as a company',
),
];
答案 4 :(得分:0)
由于答案对我来说并不令人满意,所以我找到了另一种解决方案。
Flutter使您可以在图形中的单行上写条件,因此您可以在单行上插入循环,然后插入其他不同的小部件。这是一个针对主要问题的实际示例:
Column(
children: <Widget>
[
for (int i = 0;
i < workouts.series.length;
i++)
"//CREATE N YOUR WIDGETS//",
new Text(
"${workouts.series.length} x ${exerciseWorkout.repsToDo} ",
style: TextStyle(
color: Colors.black87,
fontSize: 16,
fontWeight: FontWeight.bold),
)
],
)