记录一个自己挖坑自己埋的一个bug

119 阅读1分钟
class Region {
  int id = 0;
  List<Region> children = [];
}


List<Region> levelOneList = [];

List<Region> levelTowList = [];

int levelOneIndex = 0;
int levelTwoIndex = 0;
void onLevelOneIndexChange(int index) async{
  levelOneIndex = index;
  
  //当一级改变的时候 重置二级 三级数据
  levelTwoIndex = 0;
  levelTowList.clear();
  var levelOneRegion = levelOneList[index];
  //已经请求过接口的 不再请求 直接使用之前的数据
  if(levelOneRegion.children.isNotEmpty){
    //出问题的写法
    levelTowList = levelOneRegion.children[index].children;
  }else {
    //根据id 请求下一级数据 并赋值 levelOneRegion.children
    await requestByParentId(parent: levelOneRegion);
    //出问题的写法
    levelTowList = levelOneRegion.children[index].children;
    
  }
}

void onLevelTwoIndexChange(int index){
  levelTwoIndex = index;
}


Future requestByParentId({Region?  parent}) async{
  
}

场景是做一个类似于选择城市的多级联选。下一级的数据需要通过上一级的id去获取。

levelTowList = levelOneRegion.children[index].children;

我原本的期望是已经请求过接口的,不再请求直接使用之前的数据。但是当上一级数据改变的时候。需要清空当前级以及之后的所有数据。如下:

levelTowList.clear();

但是因为上面给levelTowList赋值的方式,导致levelTowListlevelOneRegion.children[index].children指向的是用一个集合,levelTowList清空的时候levelOneRegion.children[index].children 也会清空。导致之前的缓存的children也被清空。

levelTowList.addAll(levelOneRegion.children[index].children);

应该用addAll 的方式把children 添加进来。这样levelTowList清空的时候,不会影响到levelOneRegion.children[index].children