使用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连接成功:
- 打开插件的Android源码目录(通常在项目的
android/src/main/kotlin/下对应插件的包路径) - 找到处理设备连接的方法,调整代码顺序:先建立蓝牙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通道的处理更成熟,能减少此类初始化问题。
验证步骤
- 应用修改后重新编译运行
- 连接RN52模块并进入聊天页面
- 尝试发送消息,检查是否还出现初始化错误
内容的提问来源于stack exchange,提问作者drumanart
相关产品推荐
相关产品推荐

