gpt4 book ai didi

dart - Dart 中的不同流

转载 作者:行者123 更新时间:2023-12-05 06:59:04 37 4
gpt4 key购买 nike

我正在编写一个 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 值并更新状态管理器中的值。然后,具有合适速率的周期性计时器可以将该值更新到设备;可能只有当值自上次发送后实际发生变化时才可能。

关于dart - Dart 中的不同流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64467729/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com