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

Flutter/Dart 合并蓝牙接收的多段Uint8List为单一列表的方法

问题根源

你当前的代码无法累积数据的核心原因是:存储数据的newLst、Queue都是定义在_onDataReceived回调内部的局部变量,每次蓝牙数据块触发回调时,都会重新初始化这些空变量,之前收到的历史数据会被全部清空,自然无法完成多段数据的拼接合并。

实现步骤

要把所有分段到达的蓝牙数据合并为完整列表,只需要把存储累积数据的容器放到回调方法外部,作为页面State类的持久成员变量保存,每次收到新数据块直接追加即可:

  • 首先在对应页面的State类中,定义一个持久化的Uint8List成员变量,作为全量数据的存储容器,初始值为空列表
  • 修改数据接收回调逻辑,移除回调内部临时创建的列表、队列对象,每次收到新的数据块,就将块内的字节追加到全量存储容器中
  • 如果需要判断数据是否接收完成,可以根据你和单片机约定的规则判断:比如约定了总数据长度、固定的帧结束标识,满足条件时即可触发后续数据处理逻辑
可直接使用的代码示例
  1. 先在State类中定义全量数据存储成员:
class _YourBluetoothPageState extends State<YourBluetoothPage> {
  // 其他已有变量...
  // 持久存储全量蓝牙接收数据的容器,定义在类成员位置,不要写在方法内部
  Uint8List _fullReceivedData = Uint8List(0);

  // 其他已有initState、build等方法...
}
  1. 修改数据接收回调逻辑:
// 蓝牙输入监听逻辑可以保留原有逻辑,不需要改动
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:27:24