Flutter 为什么小部件的孩子们赢了';t更新UI,但list.map()会在添加新子项时更新
我是一个新手,我一直在努力解决在UI上不更新儿童小部件的问题。通过一些尝试,我发现在向Flutter 为什么小部件的孩子们赢了';t更新UI,但list.map()会在添加新子项时更新,flutter,Flutter,我是一个新手,我一直在努力解决在UI上不更新儿童小部件的问题。通过一些尝试,我发现在向list添加新元素后,将list作为小部件的子项传递将不起作用。但是使用list.map((widget){returnwidget;}).toList()将正常工作,并且在添加新的子项后UI将更新 简单的例子: 工作: class _SomeWidgetState extends State<SomeWidget> { List<Widget> _buttons = new Li
list
添加新元素后,将list
作为小部件的子项传递将不起作用。但是使用list.map((widget){returnwidget;}).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\u SomeWidgetState扩展状态{
列表按钮=新列表();
@凌驾
小部件构建(构建上下文){
返回GridView.count(
交叉轴计数:4,
子项:_buttons.map((小部件){
返回控件;
}).toList());
}
void _addChild(){
设置状态(){
_添加(新的SomeWidgetChild(键:UniqueKey());
});
}
//一些代码。。。
}
不工作:
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...
}
class\u SomeWidgetState扩展状态{
列表按钮=新列表();
@凌驾
小部件构建(构建上下文){
返回GridView.count(
交叉轴计数:4,
儿童:_按钮
);
}
void _addChild(){
设置状态(){
_添加(新的SomeWidgetChild(键:UniqueKey());
});
}
//一些代码。。。
}
我想问一下,为什么简单传递列表在这种情况下不起作用?第一个代码是将小部件返回到children属性,而第二个代码不是。您的第二个代码应该返回widget来更新UI。正如我所理解的,GridView仅在子项列表与以前不同时才重新生成。因此,传递对_按钮的引用将不起作用,因为我总是将相同的引用传递给只包含不同内容的列表。您只是缺少了_按钮。toList() 请参阅此DartPad上运行的完整代码
如果有任何错误,请随时发表评论。…返回小部件列表。当我初始化列表中的某个小部件时,第二个(错误的)示例显示了这个已初始化的小部件,但当调用_addChild()方法时,它不会添加新的小部件。请仔细检查第二个代码。您的_按钮中应该有一个循环。最好还是在函数中分离该操作参见源代码,它将
子对象
传递给SliverChildListDelegate
,此委托重写此处的shouldRebuild
方法:-在此处放置一个断点并检查它是如何执行的works@Filip,…这是否有助于澄清您在小部件列表中的概念…请查看DartPad代码并使用它是的,现在我明白GridView为什么会这样做了。但我认为,仅仅为了创建此列表的克隆,就需要在列表本身上使用toList()之类的方法是很奇怪的。如果它解决了您的概念,请接受答案,并为我的答案投票。。。。
return GridView.count(
crossAxisCount: 4,
children: _buttons.toList() /// this is the thing you are missing....
);