findOverrideIndices method
查找重载参数下标列表 @desc android 构造函数存在重载 此方法通过实际传入参数与构造函数参数列表集合的比对,来获取当前实际的需要使用的参数列表
先以列表集合为主
- 列表集合为空,直接返回 [] 作为本次构造函数的参数下标列表;
- 列表集合只有一个列表,直接返回该列表;
- 从多往少遍历列表集合,对照入参,如果存在某个列表的入参全部非 null,返回该列表;
再以参数实际情况为主,查找入参中最后一个非空的参数下标
- 下标为 -1,直接返回列表集合中最少的列表;
- 下标不为 -1 2.1 查找列表集合中以下标为结尾的列表返回; 2.2 查找列表集合中包含下标的数量最少的列表返回;
兜底返回数量最少的列表
Implementation
List<int> findOverrideIndices(
List<dynamic> args,
List<List<int>> indicesList,
) {
// 如果没有构造参数列表,直接返回 []
if (indicesList.length == 0) {
return [];
}
// 如果只有一个构造参数列表,不用匹配,直接返回第一项
if (indicesList.length == 1) {
return indicesList[0];
}
indicesList.sort((a, b) => b.length - a.length);
// 匹配参数全在的情况
for (final _indices in indicesList) {
if (_indices.length == 0) {
continue;
}
// 获取 _indices 对应的 args 值
final values = _indices.map((i) => args[i]).toList();
// 如果全部不为 null
if (values.every((v) => v != null)) {
return _indices;
}
}
// 如果只是部分参数存在
// 先找到最后一个非 null 的参数 index
int lastIndex = args.lastIndexWhere((arg) => arg != null);
// 如果参数列表都是 null 直接返回最少的
if (lastIndex == -1) {
return indicesList.last;
}
// 遍历 indicesList 找到 lastIndex 是哪个 indices 的最后一项
// 如果能找到就直接返回该 indices
// 当前 indicesList 已经默认为从多往少的设定
for (int i = 0; i < indicesList.length; i++) {
if (indicesList[i].length == 0) continue;
if (indicesList[i].last == lastIndex) {
return indicesList[i];
}
}
// 遍历 indicesList 找到包含 lastIndex 且数量最少的 indices 返回
for (int i = indicesList.length - 1; i >= 0; i--) {
if (indicesList[i].length == 0) continue;
if (indicesList[i].last == lastIndex) {
return indicesList[i];
}
}
// 兜底返回最少的那个
return indicesList[indicesList.length - 1];
}