Flutter应用目录存在判断逻辑不生效 抛FileSystemException报错求解
问题根因定位
- 权限已授予场景缺失目录校验逻辑:
changeScreen方法中判断权限已获取时,直接跳转MyHome页面,未调用checkWAFolder做目录存在性检查,仅首次请求权限通过后才会走校验逻辑,导致绝大多数场景下目录判断不生效。 - Android 11+ 存储权限适配缺失:若运行设备系统为Android 11(API 30)及以上,普通存储权限无法访问公共目录下的WhatsApp专属目录,需要申请所有文件访问权限才能正常读取。
MyHome页面缺少防御性校验:从报错栈可看出,MyHome的State初始化时直接调用Directory.listSync方法,未提前判断目录是否存在,即便跳转逻辑漏判,页面内也无兜底逻辑避免崩溃。
修复方案
- 补全权限已授予场景的目录校验
修改changeScreen方法逻辑,权限已获取时先执行目录检查,再根据结果跳转对应页面:
changeScreen() async { PermissionStatus status = await Permission.storage.status; if (!status.isGranted) { requestPermission(); } else { // 修复点:已有权限时先检查目录再跳转 checkWAFolder(); } }
- 适配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('请授予存储权限'); } }
新增
MyHome页面防御性校验
在homepage.dart中调用listSync读取目录内容前,先判断目录是否存在,不存在直接跳转到NoMediaPage,做双层校验兜底。可选兼容多版本WhatsApp路径
部分新版本WhatsApp的状态目录已变更为/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/.Statuses/,可在checkWAFolder中同时判断新旧两个路径是否存在,提升适配范围。
内容的提问来源于stack exchange,提问作者Yash Jha
相关产品推荐
相关产品推荐

