Flutter使用flutter_blue时滑块值变化触发write报空指针错误如何解决?
问题解决方法
错误根源
你遇到的空指针错误有两个直接原因:
- 全局声明的
BluetoothDevice device未完成初始化赋值就调用了discoverServices()方法,你需要先完成蓝牙扫描、设备连接流程,将连接成功的设备实例赋值给device变量才能调用相关方法。 - 你的
onWriteData方法中遍历服务的forEach是空逻辑,没有给全局的service变量赋值,后续调用service.characteristics也会触发空指针。
修正代码
1. 全局变量调整
var data = [0x80, 0x80, 0xF0, 0x7D, 0x05, 0x00, 0x0E, 0x01, 60, 100, 00,0x80, 0xF7]; FlutterBlue flutterBlue = FlutterBlue.instance; // 改为可空类型方便判空 BluetoothDevice? device; // 建议直接缓存目标可写特征,无需每次遍历服务 BluetoothCharacteristic? writableChar;
2. onWriteData方法修正
Future<void> onWriteData() async { // 先判空 + 校验设备连接状态 if (device == null || await device!.state.first != BluetoothDeviceState.connected) { print("蓝牙设备未连接,无法写入数据"); return; } // 已缓存特征直接写入,无需重复遍历 if (writableChar != null) { await writableChar!.write(data); return; } // 首次写入时查找对应的服务和特征 List<BluetoothService> services = await device!.discoverServices(); for (var service in services) { // 替换为你的蓝牙服务UUID if (service.uuid.toString() == "你的服务UUID") { for (var char in service.characteristics) { // 替换为你的可写特征UUID,同时确认特征具备写权限 if (char.uuid.toString() == "你的可写特征UUID" && char.properties.write) { writableChar = char; await char.write(data); return; } } } } print("未找到匹配的可写蓝牙特征"); }
3. 滑块回调方法修正
void onVolumeChanged(double value) async { setState(() { volumeValue = value; }); // 更新数据包中的音量数值,你的原数据包第9位(索引为8)是音量参数 data[8] = value.toInt(); // 异步方法需要加await等待执行完成 await onWriteData(); }
额外注意事项
- 请确保你已经完成完整的蓝牙权限申请、设备扫描、配对连接流程,连接成功后再将设备实例赋值给
device变量。 - 滑块滑动频率较高时建议加防抖逻辑,比如滑动停止300ms后再执行写入操作,避免蓝牙通信拥堵。
- 不要每次写入都调用
discoverServices,缓存特征值复用可以大幅提升通信效率。
内容的提问来源于stack exchange,提问作者BigHead
相关产品推荐
相关产品推荐

