使用flutter_blue包时蓝牙权限被拒绝的异常无法捕获如何解决
问题根因
你当前的try-catch无法捕获异常的核心原因是 flutter_blue 的 startScan 是异步Future方法,没有搭配await使用时,try-catch只能捕获同步抛出的异常,异步上下文抛出的异常会直接脱离当前作用域无法捕获。
解决方案
按以下步骤调整即可覆盖权限拒绝场景的处理:
- 优先推荐提前校验蓝牙权限再调用扫描接口,比异常捕获的用户体验更好
- 调整异步方法写法,确保异常能被正常捕获
可运行代码示例
// 先引入permission_handler包处理权限请求,需提前在pubspec.yaml添加依赖,同时按要求配置Android、iOS端的蓝牙权限声明 import 'package:permission_handler/permission_handler.dart'; import 'package:flutter_blue/flutter_blue.dart'; Future<void> scan() async { // 先校验蓝牙权限 var scanStatus = await Permission.bluetoothScan.request(); var connectStatus = await Permission.bluetoothConnect.request(); if (scanStatus.isDenied || connectStatus.isDenied) { // 权限被拒绝,此处写入你要的处理逻辑,比如弹出权限提示 log("蓝牙权限被拒绝,无法启动扫描"); return; } if (scanStatus.isPermanentlyDenied || connectStatus.isPermanentlyDenied) { // 权限被永久拒绝,可引导用户跳转系统设置页开启权限 openAppSettings(); return; } // 权限校验通过后调用扫描,搭配await捕获可能的异步异常 try { await FlutterBlue.instance.startScan(timeout: const Duration(seconds: 4)); } catch (e) { log("扫描出错: ${e.toString()}"); } }
补充说明
如果你不想提前校验权限,只需要给原有代码的startScan加上await、同时把方法改为异步方法,原有try-catch就能正常捕获到权限拒绝的异常。
内容的提问来源于stack exchange,提问作者helloitsme3
相关产品推荐
相关产品推荐

