一个页面包含一个ListView
,该页面的itemBuilder
返回一个StatefulWidget
,但是在此页面中调用setState之后,将检索到新数据,但ListView不会更新,直到将当前现有项目滚动出屏幕为止。
用StatelessWidget
替换项目是可行的,但是我的项目必须是有状态的,因为它们每个都有一些动画。
如何刷新ListView
?
ListView.builder(
padding: EdgeInsets.only(top: listMarginTop, bottom: marginBottom),
controller: scrollController,
itemCount: cellCount,
itemBuilder: (BuildContext context, int index) {
return Container(
margin: EdgeInsets.fromLTRB(marginLeft, verticalSpacing, marginRight, 0),
height: itemHeight,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
width: itemWidth,
height: itemHeight,
child: getItem(index * 2, Size(itemWidth, itemHeight)),///return a StatefulWidget
),
Container(
width: itemWidth,
height: itemHeight,
child: getItem(index * 2 + 1, Size(itemWidth, itemHeight)),
)
],
),
);
},
),
答案 0 :(得分:2)
我遇到了同样的问题。
我已添加到我的列表视图中:key: UniqueKey()
而且效果很好,不需要其他任何东西:)
答案 1 :(得分:1)
当数据更改时,应在setState()
函数内调用getItem()
函数,以便将其应用于Listview
项,事实是,当您更改数据时,这会得到支持滚动屏幕外的项目:
getItem(){
//your implementation
setState();
}