isLower static method

bool isLower(
  1. String? versionCurrent,
  2. String? versionTarget
)

判断当前版本是否小于默认指定版本

  1. 如果版本号不一致,当前 > 新,则返回false,当前 < 新,则返回true,相等继续执行
  2. 判断前缀版本字符,如果遍历中,(当前 < 新 / 当前为空),则返回true
  3. 如果前面都为返回,则默认返回false

Implementation

static bool isLower(String? versionCurrent, String? versionTarget) {
  /// 在 当前 为空,新 不为空 时,默认表示低于版本(一般大版本时会存在)
  /// 在 新 为空,默认返回不为低版本
  if ((versionCurrent?.isEmpty ?? true) && versionTarget != null) {
    return true;
  } else if (versionTarget?.isEmpty ?? true) {
    return false;
  }

  const splitVersionNum = '+';
  const splitVersionDot = '.';

  int? versionNumCurrent;
  int? versionNumTarget;
  late String versionStrCurrent;
  late String versionStrTarget;
  if (versionCurrent!.contains(splitVersionNum)) {
    final arr = versionCurrent.split(splitVersionNum);
    versionNumCurrent = int.tryParse(arr.last);
    versionStrCurrent = formatVersionStr(arr.first);
  } else {
    versionStrCurrent = formatVersionStr(versionCurrent);
  }
  if (versionTarget!.contains(splitVersionNum)) {
    final arr = versionTarget.split(splitVersionNum);
    versionNumTarget = int.tryParse(arr.last);
    versionStrTarget = formatVersionStr(arr.first);
  } else {
    versionStrTarget = formatVersionStr(versionTarget);
  }

  // 判断版本号,如果小于则直接返回
  if (versionNumCurrent != null && versionNumTarget != null) {
    if (versionNumCurrent < versionNumTarget) {
      return true;
    } else if (versionNumCurrent > versionNumTarget) {
      return false;
    }
    // 相等则继续往下执行
  }

  // 判断版本号字符
  final List<String> nowSplitArr = versionStrCurrent.split(splitVersionDot);
  final List<String> newSplitArr = versionStrTarget.split(splitVersionDot);
  for (int i = 0; i < math.max(nowSplitArr.length, newSplitArr.length); i++) {
    final nowStr = nowSplitArr.length >= (i + 1) ? nowSplitArr[i] : '';
    final newStr = newSplitArr.length >= (i + 1) ? newSplitArr[i] : '';
    final current = int.tryParse(nowStr);
    final target = int.tryParse(newStr);
    if (current != null && target != null) {
      if (current < target) {
        return true;
      } else if (current > target) {
        return false;
      } else {
        continue;
      }
    } else if (current != null && target == null) {
      continue;
    } else if (current == null && target != null) {
      return true;
    }
  }

  return false;
}