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

Flutter搭配flutter_blue和后台服务报MissingPluginException如何解决

问题原因

这个MissingPluginException报错的核心原因是:flutter_background_service运行的后台逻辑处于独立的Flutter isolate环境,默认不会自动注册主进程中初始化的原生插件,flutter_blue的方法通道在后台isolate中没有对应的原生实现,所以调用相关方法时抛出异常。

解决方案

按顺序执行以下操作即可解决:

1. 手动在后台入口注册插件

在onStart方法的最开头,添加flutter_blue插件注册逻辑:

import 'dart:io';
import 'package:flutter_blue/flutter_blue.dart';

void onStart() {
  WidgetsFlutterBinding.ensureInitialized();
  // 手动注册flutter_blue插件
  if (Platform.isAndroid) {
    FlutterBlue.registerWith();
  } else if (Platform.isIOS) {
    FlutterBlue.setPluginRegistra();
  }
  final service = FlutterBackgroundService();
  // 原有逻辑不变
  ...
}

如果手动注册后还是报错,建议将flutter_blue替换为社区维护的兼容版本flutter_blue_plus,该版本对后台isolate的适配更完善,不需要额外手动注册。

2. 修正扫描逻辑错误

原有代码刚调用startScan就立刻执行了stopScan,扫描没有时间生效,修改后的逻辑如下:

if (event!["bluetooth"] == "start") {
  FlutterBlue flutterBlue = FlutterBlue.instance;
  // 监听扫描结果
  var subscription = flutterBlue.scanResults.listen((results) {
    for (ScanResult r in results) {
      print('${r.device.name} found! rssi: ${r.rssi}');
    }
  });
  // 启动扫描,到设置的超时时间后自动停止
  flutterBlue.startScan(timeout: const Duration(seconds: 4)).whenComplete(() {
    subscription.cancel();
  });
  return;
}

3. 补充原生端权限配置

安卓端(路径:android/app/src/main/AndroidManifest.xml)

添加蓝牙、后台运行相关权限:

<!-- 蓝牙基础权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 安卓12+蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- 后台运行权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

iOS端(路径:ios/Runner/Info.plist)

添加蓝牙权限和后台运行模式声明:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要蓝牙权限来扫描和连接设备</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>需要蓝牙权限来连接外设</string>
<key>UIBackgroundModes</key>
<array>
  <string>bluetooth-central</string>
  <string>fetch</string>
  <string>processing</string>
</array>

4. 清理缓存重新编译

执行以下命令清除旧构建缓存后重新运行项目即可:

flutter clean
flutter pub get

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:39:02