颤振-ListView在提供程序调用notifyListeners后未更新?

颤振-ListView在提供程序调用notifyListeners后未更新?,listview,flutter,dart,provider,rxdart,Listview,Flutter,Dart,Provider,Rxdart,我用Rxdart提供程序模式(dio的http请求)构建了我的应用程序。当我从服务器获取数据时,通过调用addAll()方法更新其数据列表后,我的ListView不会重建;然而,当我尝试dataList=newDataList时,它工作了!ListView已成功更新。请告诉我原因 提供者: class ServicesVM extends BaseProvider { final ServicesRepository _model; List<ServiceEntity> s

我用Rxdart提供程序模式(dio的http请求)构建了我的应用程序。当我从服务器获取数据时,通过调用
addAll()
方法更新其数据列表后,我的ListView不会重建;然而,当我尝试
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((_) {})
    );
classservicesvm扩展了BaseProvider{
最终服务储备模型;
列表服务列表=[];
货物清单=[];
服务支持向量机(此._模型);
void getServices(){
添加订阅(
_model.getServices()
.doOnData((数据){
//现在工作
addAll((data.data作为列表).map(
(ele)=>ServiceEntity.fromJson(ele)
));
//工作
/*列表温度=[];
临时addAll((data.data作为列表).map(
(ele)=>ServiceEntity.fromJson(ele)
));
服务列表=临时*/
serviceList.asMap().forEach((i,v){
v、 所选=i==0;
});
currGoods=serviceList[0]。货物;
})doOnDone先生(){
serviceList.forEach(打印);
notifyListeners();
}).听(({})
);
列表视图:

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(),);
                    },
                  ),
                ),
容器(
宽度:99.dp,
高度:双无限,
颜色:颜色(Iro.gray4),
子:选择器(
选择器:(上下文,提供程序)=>provider.serviceList,
生成器:(上下文、值、子级){
返回ListView.separated(
分离器生成器:\u获取分离器,
itemBuilder:(上下文,索引){
返回_getLabelItem(索引,值[索引]);
},
itemCount:value.length,
填充:常量边集。全部(0),
物理学:NeverScrollableScrollPhysics(),);
},
),
),

我一直在争先恐后地回答这个问题。我已经在同一个问题上纠缠了几天。请使用ListView.builder()。之所以这样做有效,是因为Flatter使用了不可变的对象。因此,尽管基础数据发生了更改,ListView不会重新绘制