gpt4 book ai didi

stream - 从 Dart 中的流创建新流

转载 作者:行者123 更新时间:2023-12-03 03:12:51 27 4
gpt4 key购买 nike

我怀疑我对 Dart 中的 Stream 的理解可能有一些漏洞......

我有一种情况,我希望 Dart 应用程序响应间歇性输入(这会立即建议使用 Streams -- 或 Future,也许)。我可以使用 listener 函数实现我想要的行为,但我想知道如何以更好、更像 Dartesque 的方式做到这一点。

作为一个简单的示例,以下(工作中的)程序监听来自用户的键盘输入,并在每次按下空格键时向文档添加一个 div 元素,其中包含自上一个空格以来键入的内容。

import  'dart:html';

main() {
listenForSpaces(showInput);
}

void listenForSpaces(void Function(String) listener) {
var input = List<String>();
document.onKeyDown.listen((keyboardEvent) {
var key = keyboardEvent.key;
if (key == " ") {
listener(input.join());
input.clear();
} else {
input.add(key.length > 1 ? "[$key]" : key);
}
});
}

void showInput(String message) {
document.body.children.add(DivElement()..text = message);
}

我想做的是从我正在收听的 Stream 创建一个新的 Stream (在上面的例子中,创建来自 onKeyDown 的新 Stream)。换句话说,我可以将上面的程序设置为:

var myStream = ...
myStream.listen(showInput);

我怀疑有一种方法可以创建一个Stream,然后在不同的时间和地点,向其中插入元素或调用它发出一个值:感觉好像我错过了简单的东西。无论如何,我们将不胜感激对文档的任何帮助或指导。

最佳答案

使用 async* 函数从现有流创建新流相当容易。对于普通流,我会这样做:

Stream<String> listenForSpaces() async* {
var input = <String>[];
await for (var keyboardEvent in document.onKeyDown) {
var key = keyboardEvent.key;
if (key == " ") {
yield input.join();
input.clear();
} else {
input.add(key.length > 1 ? "[$key]" : key);
}
}
}

async* 函数会将暂停传播到底层流,并且它可能会在 yield 期间暂停源。这可能是也可能不是您想要的,因为暂停 DOM 事件流可能会导致您错过事件。对于 DOM 流,我可能更愿意使用上面基于 StreamController 的解决方案。

关于stream - 从 Dart 中的流创建新流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53137916/

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