我试图熟悉颤动,并且遇到一些奇怪的情况。我想建立一个动态ListView的+按钮可以添加元素的地方。我编写了以下状态代码:
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在底部添加了一个简单的小部件,该小部件显示了列表的大小。当我单击“添加/删除”按钮并正确刷新时,此选项可以正常工作。我想念什么吗?
_objectList
Text
Flutter基于不可变数据。这意味着,如果对对象的引用未更改,则内容也不会更改。
问题是,在您的情况下,您总是发送到ListView同一数组,而改变其内容。但这导致ListView假定列表没有更改,因此防止了无用的渲染。
您可以更改setState以记住这一点:
setState
setState(() { _objectList = List.from(_objectList) ..add(Text("foo")); });