forEachFlutterDir function

Future<void> forEachFlutterDir(
  1. String path, {
  2. bool clearBuild = true,
  3. bool clearPods = false,
  4. bool clearGradle = false,
})

遍历 Flutter dir

Implementation

Future<void> forEachFlutterDir(String path,
    {bool clearBuild = true,
    bool clearPods = false,
    bool clearGradle = false}) async {
  // 不是文件夹退出
  if (!await FileSystemEntity.isDirectory(path)) {
    return;
  }
  // 隐藏文件退出
  if (!path.startsWith(kDartToolDir) &&
      path.split(Platform.pathSeparator).last.startsWith('.')) {
    // print('🙈 Hidden folder skip');
    return;
  }
  // 开始遍历
  var fileList = Directory(path).listSync(followLinks: false);
  var fileNameList =
      fileList.map((e) => e.path.split(Platform.pathSeparator).last).toList();
  // 检查 Flutter 目录
  if (fileNameList.contains(kPubspecYaml)) {
    // 处理 package 有 example 的情况
    if (fileNameList.contains(kExampleDir)) {
      String exampleDirPath = '$path${Platform.pathSeparator}$kExampleDir';
      if (Directory(exampleDirPath).existsSync()) {
        await forEachFlutterDir(
          exampleDirPath,
          clearBuild: clearBuild,
          clearPods: clearPods,
          clearGradle: clearGradle,
        );
      }
    }
    // 清理 build
    if (clearBuild &&
        (fileNameList.contains(kBuildDir) ||
            fileNameList.contains(kDartToolDir))) {
      await runClean(path);
    }

    // 清理 Pods
    if (clearPods &&
        Directory('$path${Platform.pathSeparator}$kIosPodsDir').existsSync()) {
      await runPodsClean(path);
    }

    // 清理 gradle
    if (clearGradle &&
        Directory('$path${Platform.pathSeparator}$kAndroidDir').existsSync()) {
      await runGradleClean(path);
    }
  } else {
    // 没有 Flutter 目录,继续遍历:$path
    for (var file in fileList) {
      await forEachFlutterDir(
        file.path,
        clearBuild: clearBuild,
        clearPods: clearPods,
        clearGradle: clearGradle,
      );
    }
  }
}