如何获得间隔不均匀的飞镖流?

How do I get a dart Stream with uneven intervals?

我是 dart 和 Flutter 的新手,很想就我面临的算法问题获得一些建议。

我想将我的 Flutter 应用程序连接到蓝牙设备(该部分已完成,我已经连接)并以不均匀的间隔发送消息。我有一个列表中的消息,对于每条消息,我都知道我想在什么时间(毫秒)发送消息。

因此假设排列了以下消息:

我找到了创建流的文档,但它总是谈论单个间隔值。 https://dart.dev/articles/libraries/creating-streams.

想法:

如果能暂停/取消直播就好了。这是流本身可以做的事情。

我认为最简单的方法是按指定的时间间隔发出这些消息。类似于:

Future<void> _wait(int milliseconds) async =>
  await Future<void>.delayed(Duration(milliseconds: milliseconds));

Stream<String> generateMessages() async* {
  yield 'start';
  await _wait(100);
  yield 'init_all';
  await _wait(400);
  yield 'user_pick_x';
  yield 'user_start_x';
  await _wait(3000);
  yield 'interrupt';
}

void main() {
  generateMessages().listen((msg) {
    print('${DateTime.now()}: $msg');
  });
}

这将打印:

2021-07-25 10:21:21.429: start
2021-07-25 10:21:21.531: init_all
2021-07-25 10:21:21.934: user_pick_x
2021-07-25 10:21:21.934: user_start_x
2021-07-25 10:21:24.938: interrupt

如果你想确保流的侦听器异步接收事件 - 因此不干扰等待毫秒,你可以显式使用 StreamController 默认情况下异步调用侦听器(确保import dart:async --- dart:io 仅在 sleep 的示例中使用,以表明即使在阻塞操作中它也会 运行 与等待并行):

import 'dart:async';
import 'dart:io';

Future<void> _wait(int milliseconds) async {
  print('WAIT $milliseconds ms');
  await Future<void>.delayed(Duration(milliseconds: milliseconds));
}

Stream<String> generateMessages() {
  final controller = StreamController<String>(sync: false);
  controller.onListen = () async {
    controller.add('start');
    await _wait(100);
    controller.add('init_all');
    await _wait(400);
    controller.add('user_pick_x');
    controller.add('user_start_x');
    await _wait(3000);
    controller.add('interrupt');
  };
  return controller.stream;
}

void main() {
  generateMessages().listen((msg) {
    sleep(const Duration(milliseconds: 120));
    print('${DateTime.now()}: $msg');
  });
}