Flutter 为什么小部件的孩子们赢了';t更新UI,但list.map()会在添加新子项时更新

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

我是一个新手,我一直在努力解决在UI上不更新儿童小部件的问题。通过一些尝试,我发现在向
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....
);