dart - Dart 中的不同流

我正在编写一个 flutter 应用程序,它通过蓝牙 (FlutterBlue) 向设备发送命令。该设备控制一些 LED。 通信总体上运行良好,但是: 在用户界面上,我有一个控制光强度的 slider 。当我拉动 slider 时,生成的值多于蓝牙后端可以处理的值。

在我的第一个实现中,我将数据直接发送到蓝牙特性,导致蓝牙后端出现异常并且一些值丢失。很难将光线减弱到零。

在我的第二种方法中,我使用流和 await for 循环来发送数据。现在所有值都无一异常(exception)地发送,但是在释放 slider 后需要几秒钟才能发送所有值。因为我想要 LED 上的直接视觉反馈,所以这不是一个选项。

由于有多个相同类型的命令要发送,我可以跳过在蓝牙发送例程处理写入事件时添加的所有相同类型的命令。

我看到有一个 Stream.Distinct 方法但是:它返回一个新的流。所以我必须退出我的 await for 循环并处理新流。

有没有一种方法可以从现有流中删除不需要的事件,而无需创建我必须收听的新流?

这是我正在做的:

class MyBlueToothDevice {
  BluetoothDevice _device;
  List<BluetoothCharacteristic> _characteristics =
      List<BluetoothCharacteristic>();

  final _sendStream = StreamController<Tuple2<SendCommands, List<int>>>();

  MyBlueToothDevice(this._device) {
    _writeNext();
  }

  Future<void> write(SendCommands command, List<int> value) async {
    if (isConnected) {
      _sendStream.add(Tuple2<SendCommands, List<int>>(command, value));
      // await _characteristics[command.index].write(value).catchError((value) {
      //   print("Characteristics.write error: $value");
      // });
    }
  }

  Future<void> _writeNext() async {
    await for (var tuple in _sendStream.stream) {
      await _characteristics[tuple.item1.index]
          .write(tuple.item2)
          .catchError((value) {
        print("Characteristics.write error: $value");
      });
    }
  }
}

最佳答案

最好的解决方案是使用应用程序状态管理来接收来自 slider 的所有事件。然后,状态管理器会将发送到设备的消息速率限制在它可以处理的范围内,并确保不会丢失最新的消息。

一个非常基本的解决方案是接收 slider 值并更新状态管理器中的值。然后,具有合适速率的周期性计时器可以将该值更新到设备;可能只有当值自上次发送后实际发生变化时才可能。

https://stackoverflow.com/questions/64467729/

相关文章:

authentication - Telegram 登录小部件因禁用跨站点 cookie 而损坏

java - 修改 tomcat 上静态 Assets 的 header cookie 并使用 ap

firebase - 使用 Mockito 为 Firebase 用户身份验证设置单元测试

ansible - Ansible 中角色的串行执行

javascript - Windows Localhost 中的 Wiki.js 安装

python-3.x - 一个FITS文件的坐标转换问题

node.js - AWS sdk 使用 sso 获取凭证

reactjs - 如何始终覆盖具有不确定后缀的 JSS 样式?

matlab - 由凸包创建的曲面上点值的插值

java - 微服务之间的通信和使用 REST 的内聚