gpt4 book ai didi

dart - ListView 不刷新,而附加列表会刷新(Flutter)

转载 作者:IT王子 更新时间:2023-10-29 06:36:36 26 4
gpt4 key购买 nike

我正在尝试熟悉 Flutter,但遇到了一些奇怪的情况。我想构建一个动态 ListView,其中 + 按钮允许添加元素。我写了以下状态代码:

class MyWidgetListState extends State<MyWidgetList> {
List<Widget> _objectList = <Widget>[
new Text('test'),
new Text('test')
];

void _addOne() {
setState(() {
_objectList.add(new Text('test'));
});
}

void _removeOne() {
setState(() {
_objectList.removeLast();
});
}

@override
Widget build(BuildContext context) {
return new Column(
children: <Widget>[
new ListView(
shrinkWrap: true,
children: _objectList
),
new Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new IconButton(
icon: new Icon(Icons.remove_circle),
iconSize: 36.0,
tooltip: 'Remove',
onPressed: _objectList.length > 2 ? _removeOne : null,
),
new IconButton(
icon: new Icon(Icons.add_circle),
iconSize: 36.0,
tooltip: 'Add',
onPressed: _addOne,
)
],
),
new Text(_objectList.length.toString())
],
);
}
}

我的问题是 ListView 在视觉上被我初始化它的 2 个元素卡住了。

_objectList 在内部得到了很好的管理。出于测试目的,我在底部添加了一个简单的 Text 小部件,用于显示列表的大小。当我单击“添加/删除”按钮并且它得到正确刷新时,这个工作正常。我错过了什么吗?

最佳答案

Flutter 基于不可变数据。这意味着如果对对象的引用没有改变,那么内容也没有改变。

问题是,在您的情况下,您总是向 ListView 发送相同的数组,而不是改变其内容。但这会导致 ListView 假设列表没有改变,从而防止无用的渲染。

您可以更改您的 setState 以记住这一点:

setState(() {
_objectList = List.from(_objectList)
..add(Text("foo"));
});

关于dart - ListView 不刷新,而附加列表会刷新(Flutter),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51813435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com