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赋值的方式,导致levelTowList与levelOneRegion.children[index].children指向的是用一个集合,levelTowList清空的时候levelOneRegion.children[index].children 也会清空。导致之前的缓存的children也被清空。
levelTowList.addAll(levelOneRegion.children[index].children);
应该用addAll 的方式把children 添加进来。这样levelTowList清空的时候,不会影响到levelOneRegion.children[index].children