listview - Flutter - 提供者调用 notifyListeners 后 ListView 不更新?
问题描述
我使用 Rxdart-provider 模式(dio 的 http 请求)构建了我的应用程序。当我从服务器获取数据时,通过调用方法更新其数据列表后,我的 ListView 未重建addAll()
;但是,当我尝试时dataList = newDataList
,它可以工作!ListView 更新成功。请有人告诉我原因。
提供者:
class ServicesVM extends BaseProvider {
final ServicesRepository _model;
List<ServiceEntity> serviceList = [];
List<Goods> currGoods = [];
ServicesVM(this._model);
void getServices() {
addSubscription(
_model.getServices()
.doOnData((data) {
//now work
serviceList.addAll((data.data as List).map(
(ele) => ServiceEntity.fromJson(ele)
));
//works
/*List<ServiceEntity> temp = [];
temp.addAll((data.data as List).map(
(ele) => ServiceEntity.fromJson(ele)
));
serviceList=temp;*/
serviceList.asMap().forEach((i,v) {
v.selected = i == 0;
});
currGoods = serviceList[0].goods;
}).doOnDone(() {
serviceList.forEach(print);
notifyListeners();
}).listen((_) {})
);
列表显示:
Container(
width: 99.dp,
height: double.infinity,
color: Color(Iro.gray4),
child: Selector <ServicesVM, List<ServiceEntity>>(
selector: (context,provider) => provider.serviceList,
builder: (context,value,child){
return ListView.separated(
separatorBuilder: _getSeparator,
itemBuilder: (context,index) {
return _getLabelItem(index,value[index]);
},
itemCount: value.length,
padding: const EdgeInsets.all(0),
physics: NeverScrollableScrollPhysics(),);
},
),
),
解决方案
我一直在争取 50 声望来回答这个问题。几天来,我一直被困在同一个问题上。使用 ListView.builder()。之所以可行,是因为 Flutter 使用了不可变对象。所以尽管底层数据发生了变化,ListView 并没有重绘。
推荐阅读
- javascript - X 可编辑组合返回“脚本错误”。
- pine-script - 带有错误 ID 的 Pine 脚本和交易视图关闭条目
- typescript - 对象在 catch 块上属于“未知”类型
- javascript - Angular-Ag-Grid:如何在数据完全加载后和另一个事件发生后禁用特定行单元格中的复选框或单选输入?
- html - `position: absolute;`可以改变截距吗?
- coldfusion - ColdFusion 的 SecretKeySpec
- algorithm - 数组中的大反转数
- html - 如何在html中将品牌名称放在徽标的右侧?
- matplotlib - OSMnx:如何在现有图形上绘制路线?
- html - 如何在闪亮的应用程序中添加半个换行符?