findOverrideIndices method

List<int> findOverrideIndices(
  1. List args,
  2. List<List<int>> indicesList
)
inherited

查找重载参数下标列表 @desc android 构造函数存在重载 此方法通过实际传入参数与构造函数参数列表集合的比对,来获取当前实际的需要使用的参数列表

先以列表集合为主

  1. 列表集合为空,直接返回 [] 作为本次构造函数的参数下标列表;
  2. 列表集合只有一个列表,直接返回该列表;
  3. 从多往少遍历列表集合,对照入参,如果存在某个列表的入参全部非 null,返回该列表;

再以参数实际情况为主,查找入参中最后一个非空的参数下标

  1. 下标为 -1,直接返回列表集合中最少的列表;
  2. 下标不为 -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];
}