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

使用all_bluetooth包发送消息时出现lateinit未初始化错误

解决all_bluetooth发送消息时lateinit property sendReceive has not been initialized错误

问题背景

我使用all_bluetooth: ^0.1.0插件连接Microchip RN52蓝牙模块,相关配置如下:

  • pubspec.yaml依赖部分:
dependencies:
  flutter:
    sdk: flutter
  plugin_platform_interface: ^2.0.2
  cupertino_icons: ^1.0.2
  all_bluetooth: ^0.1.0
  • AndroidManifest.xml权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

目前能正常连接模块并进入ChatScreen页面,但发送消息时触发以下错误:

E/flutter (20020): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(error, lateinit property sendReceive has not been initialized, null, kotlin.UninitializedPropertyAccessException: lateinit property sendReceive has not been initialized

问题分析

这个错误是插件Android端Kotlin代码里,标记为lateinit的sendReceive变量未初始化就被调用了。本质是蓝牙连接成功的通知发得太早,此时负责数据收发的RFCOMM串口通道还没建立完成,导致发送消息时找不到可用的收发对象。

解决方案

1. 指定RN52模块的串口服务UUID

RN52默认使用的串口服务UUID一般是0000FFE1-0000-1000-8000-00805F9B34FB,插件可能默认用了其他UUID,导致无法正确建立数据通道。修改连接代码,手动指定这个UUID:

找到DeviceListWidget中的连接逻辑,修改为:

onTap: () async {
  // RN52的标准串口服务UUID
  const rn52ServiceUuid = "0000FFE1-0000-1000-8000-00805F9B34FB";
  await _allBluetooth.connectToDevice(device.address, serviceUuid: rn52ServiceUuid);
},

注意:如果插件的connectToDevice方法不支持传入serviceUuid参数,需要查看插件文档确认配置方式,或者升级插件版本。

2. 修复插件Android端的初始化逻辑

如果插件本身存在逻辑漏洞,需要修改Android端代码,确保sendReceive初始化完成后再通知Flutter连接成功:

  1. 打开插件的Android源码目录(通常在项目的android/src/main/kotlin/下对应插件的包路径)
  2. 找到处理设备连接的方法,调整代码顺序:先建立蓝牙Socket并初始化收发对象,再发送连接成功的事件
    示例Kotlin代码修改:
// 原代码可能提前发送了连接成功通知,需要调整顺序
val targetUuid = UUID.fromString(serviceUuid ?: "0000FFE1-0000-1000-8000-00805F9B34FB")
val socket = device.createRfcommSocketToServiceRecord(targetUuid)
socket.connect()
// 初始化收发对象
sendReceive = BluetoothSendReceive(socket.inputStream, socket.outputStream)
// 再通知Flutter连接成功
channel.invokeMethod("onConnectionChanged", mapOf(
    "state" to true,
    "device" to mapOf("name" to device.name, "address" to device.address)
))

3. 更换成熟的蓝牙插件

如果all_bluetooth 0.1.0版本存在未完善的问题,可以更换更稳定的插件,比如flutter_blue_plus(通用蓝牙插件)或blue_thermal_printer(针对串口类蓝牙设备),这些插件对RFCOMM通道的处理更成熟,能减少此类初始化问题。

验证步骤

  1. 应用修改后重新编译运行
  2. 连接RN52模块并进入聊天页面
  3. 尝试发送消息,检查是否还出现初始化错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:12:33