You need to enable JavaScript to run this app. Flutter应用目录存在判断逻辑不生效 抛FileSystemException报错求解
优惠活动
大模型
产品
解决方案
定价
更多

Flutter应用目录存在判断逻辑不生效 抛FileSystemException报错求解

问题根因定位
  • 权限已授予场景缺失目录校验逻辑:changeScreen方法中判断权限已获取时,直接跳转MyHome页面,未调用checkWAFolder做目录存在性检查,仅首次请求权限通过后才会走校验逻辑,导致绝大多数场景下目录判断不生效。
  • Android 11+ 存储权限适配缺失:若运行设备系统为Android 11(API 30)及以上,普通存储权限无法访问公共目录下的WhatsApp专属目录,需要申请所有文件访问权限才能正常读取。
  • MyHome页面缺少防御性校验:从报错栈可看出,MyHome的State初始化时直接调用Directory.listSync方法,未提前判断目录是否存在,即便跳转逻辑漏判,页面内也无兜底逻辑避免崩溃。
修复方案
  1. 补全权限已授予场景的目录校验
    修改changeScreen方法逻辑,权限已获取时先执行目录检查,再根据结果跳转对应页面:
changeScreen() async {
  PermissionStatus status = await Permission.storage.status;
  if (!status.isGranted) {
    requestPermission();
  } else {
    // 修复点:已有权限时先检查目录再跳转
    checkWAFolder();
  }
}
  1. 适配Android 11及以上版本的存储权限
    首先在android/app/src/main/AndroidManifest.xml中添加高版本权限声明:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

再调整权限申请逻辑,高版本系统引导用户开启所有文件访问权限:

requestPermission() async {
  if (Platform.isAndroid && Platform.version.sdkInt >= 30) {
    bool hasManagePermission = await Permission.manageExternalStorage.isGranted;
    if (!hasManagePermission) {
      await Permission.manageExternalStorage.request();
      hasManagePermission = await Permission.manageExternalStorage.isGranted;
    }
    if (hasManagePermission) {
      checkWAFolder();
    } else {
      Dialogs.showToast('请授予所有文件访问权限');
    }
    return;
  }
  // 低版本系统原有逻辑
  PermissionStatus status = await Permission.storage.request();
  if (status.isGranted) {
    checkWAFolder();
  } else {
    Dialogs.showToast('请授予存储权限');
  }
}
  1. 新增MyHome页面防御性校验
    在homepage.dart中调用listSync读取目录内容前,先判断目录是否存在,不存在直接跳转到NoMediaPage,做双层校验兜底。

  2. 可选兼容多版本WhatsApp路径
    部分新版本WhatsApp的状态目录已变更为/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/.Statuses/,可在checkWAFolder中同时判断新旧两个路径是否存在,提升适配范围。

内容的提问来源于stack exchange,提问作者Yash Jha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 22:36:03