Flutter应用打开设置闪退问题求助(Realme 8、华为P30)
解决Flutter应用调用openAppSettings后崩溃的问题
在Realme 8(Android 11)和华为P30(Android 9)这类设备上,使用permission_handler的openAppSettings()方法出现打开设置后立即返回并崩溃的问题,主要是旧版本库的适配缺陷或错误处理逻辑不严谨导致的,以下是可行的解决方案:
方案1:升级库版本并优化错误处理
旧版permission_handler对部分Android定制系统的适配存在问题,首先确保你使用的是最新稳定版,然后调整错误处理逻辑(避免onError与try/catch混用导致异常遗漏):
import 'package:permission_handler/permission_handler.dart' as p; void openAppSettingsSafely() async { try { final bool isOpened = await p.openAppSettings(); if (!isOpened) { showToast('无法打开应用设置'); } } catch (e) { showToast('打开设置失败: ${e.toString()}'); } }
方案2:原生Intent兜底跳转
如果方案1仍无法解决问题,可以直接通过Android原生Intent跳转应用设置页面,避免依赖第三方库的适配问题:
首先添加url_launcher依赖到pubspec.yaml,然后使用以下代码:
import 'package:url_launcher/url_launcher.dart'; import 'package:permission_handler/permission_handler.dart' as p; void openAppSettingsSafely() async { bool openedSuccessfully = false; // 先尝试用permission_handler try { openedSuccessfully = await p.openAppSettings(); } catch (_) {} if (!openedSuccessfully) { // 兜底用原生跳转逻辑 try { final String packageName = await p.PermissionHandler().applicationPackage; final Uri settingsUri = Uri.parse('package:$packageName'); if (await canLaunchUrl(settingsUri)) { await launchUrl(settingsUri, mode: LaunchMode.externalApplication); openedSuccessfully = true; } } catch (e) { showToast('打开设置失败: ${e.toString()}'); } } if (!openedSuccessfully) { showToast('无法打开应用设置'); } }
额外注意事项
- 清理应用缓存或卸载重装后测试,避免旧缓存导致的异常;
- 检查AndroidManifest.xml中未添加限制应用跳转的权限(默认无需额外配置);
- Android 11设备无需额外申请
QUERY_ALL_PACKAGES权限,跳转自身应用设置不受影响。
内容的提问来源于stack exchange,提问作者Adesh Yadav
相关产品推荐
相关产品推荐

