我是新手,我一直在努力不更新UI上的子代小部件的问题。经过一些尝试,我发现在将新元素添加到list
之后,将list
作为小部件的子级传递是无效的。但是使用list.map((widget) {return widget;}).toList();
可以完美地工作,并且在添加新子项之后UI将会更新
简单的例子:
工作:
class _SomeWidgetState extends State<SomeWidget> {
List<Widget> _buttons = new List();
@override
Widget build(BuildContext context) {
return GridView.count(
crossAxisCount: 4,
children: _buttons.map((widget) {
return widget;
}).toList());
}
void _addChild(){
setState(() {
_buttons.add(new SomeWidgetChild(key: UniqueKey()));
});
}
//some code...
}
不起作用:
class _SomeWidgetState extends State<SomeWidget> {
List<Widget> _buttons = new List();
@override
Widget build(BuildContext context) {
return GridView.count(
crossAxisCount: 4,
children: _buttons
);
}
void _addChild(){
setState(() {
_buttons.add(new SomeWidgetChild(key: UniqueKey()));
});
}
//some code...
}
我想问为什么在这种情况下简单的传递列表不起作用?
答案 0 :(得分:0)
据我对pskink comment的理解,仅当子列表与以前不同时才重新构建GridView。因此,传递对 _buttons 的引用将不起作用,因为我一直将相同的引用传递给仅具有不同内容的列表。
答案 1 :(得分:0)
您只是缺少_buttons.toList();
return GridView.count(
crossAxisCount: 4,
children: _buttons.toList() /// this is the thing you are missing....
);
查看在此DartPad ListOfWidgetBuild 上运行的完整代码
如有任何错误,请随时发表评论。...
答案 2 :(得分:-1)
第一个代码将小部件返回给children属性,而第二个代码则没有。您的第二个代码应返回小部件以更新UI。