我正在尝试熟悉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
小部件,用于显示列表的大小。当我点击Add/Remove按钮时,它可以很好地工作,并且它会被正确刷新。我是不是遗漏了什么?
发布于 2018-08-13 07:01:02
Flutter基于不可变的数据。这意味着如果对对象的引用没有改变,那么内容也不会改变。
问题是,在您的示例中,总是将相同的数组发送到ListView
,而不是改变其内容。但这会导致ListView
假设列表没有变化,从而阻止了无用的渲染。
您可以更改您的setState
以记住这一点:
setState(() {
_objectList = List.from(_objectList)
..add(Text("foo"));
});
https://stackoverflow.com/questions/51813435
复制相似问题