ListView不刷新,而所附的列表却可以(Flutter)

8 浏览
0 Comments

ListView不刷新,而所附的列表却可以(Flutter)

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

class MyWidgetListState extends State {

List _objectList = [

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: [

new ListView(

shrinkWrap: true,

children: _objectList

),

new Row(

mainAxisAlignment: MainAxisAlignment.center,

children: [

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小部件,显示列表的大小。当我点击添加/删除按钮时,它可以正确地刷新。我是否遗漏了什么?

0
0 Comments

问题原因:Flutter基于不可变数据。这意味着如果对象的引用没有改变,那么内容也不会改变。问题是,在这种情况下,您始终将相同的数组发送给ListView,并且改变了其内容。但是这会导致ListView认为列表没有改变,因此阻止了无用的渲染。

解决方法:您可以改变setState来考虑这一点:

setState(() {

_objectList = List.from(_objectList)

..add(Text("foo"));

});

非常感谢您的帮助和解释,现在它运行得很好。

我正在实现分页,所以我正在将一堆文档添加到列表中。在setstate()中,posts = List.from(posts)..addAll(snapshot.documents.map((doc) {Post.fromDocument(doc);}).toList()); 这是我的代码片段,但似乎对我不起作用。我无法弄清楚问题出在哪里。请帮忙看看。对于代码片段的奇怪外观,请谅解。

0
0 Comments

问题的原因是ListView在刷新时不会更新,而附加的列表会更新。解决方法是将ListView替换为ListView.builder。

代码如下:

ListView.builder(

itemBuilder: (ctx, item) {

return _objectList[item];

},

shrinkWrap: true,

itemCount: _objectList.length,

),

输出结果为一个动画图像。

0