Flutter/Dart 合并蓝牙接收的多段Uint8List为单一列表的方法
问题根源
你当前的代码无法累积数据的核心原因是:存储数据的newLst、Queue都是定义在_onDataReceived回调内部的局部变量,每次蓝牙数据块触发回调时,都会重新初始化这些空变量,之前收到的历史数据会被全部清空,自然无法完成多段数据的拼接合并。
实现步骤
要把所有分段到达的蓝牙数据合并为完整列表,只需要把存储累积数据的容器放到回调方法外部,作为页面State类的持久成员变量保存,每次收到新数据块直接追加即可:
- 首先在对应页面的State类中,定义一个持久化的
Uint8List成员变量,作为全量数据的存储容器,初始值为空列表 - 修改数据接收回调逻辑,移除回调内部临时创建的列表、队列对象,每次收到新的数据块,就将块内的字节追加到全量存储容器中
- 如果需要判断数据是否接收完成,可以根据你和单片机约定的规则判断:比如约定了总数据长度、固定的帧结束标识,满足条件时即可触发后续数据处理逻辑
可直接使用的代码示例
- 先在State类中定义全量数据存储成员:
class _YourBluetoothPageState extends State<YourBluetoothPage> { // 其他已有变量... // 持久存储全量蓝牙接收数据的容器,定义在类成员位置,不要写在方法内部 Uint8List _fullReceivedData = Uint8List(0); // 其他已有initState、build等方法... }
- 修改数据接收回调逻辑:
// 蓝牙输入监听逻辑可以保留原有逻辑,不需要改动 connection!.input!.listen(_onDataReceived).onDone(() { if (isDisconnecting) { print('Disconnecting locally!'); } else { print('Disconnected remotely!'); } if (this.mounted) { setState(() {}); } }); // 修改后的接收回调 void _onDataReceived(Uint8List dataBlock) { // 将新收到的数据块追加到全量数据末尾 _fullReceivedData = Uint8List.fromList([ ..._fullReceivedData, ...dataBlock ]); // 调试:打印当前累计总长度,确认数据正常累积 print("已累计接收字节数:${_fullReceivedData.length}"); print("本次收到的数据块:$dataBlock"); // 按需添加接收完成判断,满足条件后触发后续处理 // 示例:如果约定总数据长度为1200字节,收到足够长度就处理 // if (_fullReceivedData.length >= 1200) { // _processSamplingData(_fullReceivedData); // } }
注意:如果你需要重复接收多组完整数据,记得在每组数据处理完成后,把
_fullReceivedData重置为空的Uint8List(0),避免下一组数据和上一组数据混在一起。
内容的提问来源于stack exchange,提问作者taha khamis
相关产品推荐
相关产品推荐

