【问题标题】:Flutter - ListView not updating after provider call notifyListeners?Flutter - 提供者调用 notifyListeners 后 ListView 不更新?
【发布时间】:2020-07-16 11:05:33
【问题描述】:

我使用 Rxdart-provider 模式(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((_) {})
    );

列表视图:

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(),);
                    },
                  ),
                ),

【问题讨论】:

    标签: listview flutter dart provider rxdart


    【解决方案1】:

    我一直在争取 50 声望来回答这个问题。几天来,我一直被困在同一个问题上。使用 ListView.builder()。之所以可行,是因为 Flutter 使用了不可变对象。所以虽然底层数据发生了变化,但 ListView 不会重绘。

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 2020-04-07
      • 1970-01-01
      • 2020-11-19
      • 2021-12-23
      • 2021-06-29
      • 2021-08-28
      • 1970-01-01
      • 2021-12-02
      相关资源
      最近更新 更多