You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:57:02