我正在尝试围绕 Dart Streams 进行思考。特别是这个命令行实用程序示例cat具有以下代码行:
Stream<List<int>> stream = new File(path).openRead();
// Transform the stream using a `StreamTransformer`. The transformers
// used here convert the data to UTF8 and split string values into
// individual lines.
return stream
.transform(UTF8.decoder)
.transform(const LineSplitter())
.listen((line) {
if (showLineNumbers) {
stdout.write('${lineNumber++} ');
}
stdout.writeln(line);
}).asFuture().catchError((_) => _handleError(path));
Run Code Online (Sandbox Code Playgroud)
Stream<T>as的声明Stream<List<int>>让我有点困惑。为什么不将其声明为Stream<int>. List<> 类型如何使它与众不同。如果是列表,订阅者事件是否以某种方式缓冲?
什么类型(如<T>)被传递给第一个转换?它是一个int还是一个List<int>?
传递给每个下一个转换的类型以及决定它们的类型的因素。
此示例是否在将转换结果传递给下一个转换之前读取整个文件?如果是这样,是否有关于如何流式传输非常大的文件的示例,类似于这个 Node 问题Parsing large logfiles in Node.js - read …
我正在寻找一种方法来以编程方式将变换器添加到已经正在侦听的现有流中.
例:
Stream numbers = new Stream.fromIterable([0,1,2,3]);
numbers.listen((number) => print(number));
Run Code Online (Sandbox Code Playgroud)
现在响应一些UI事件,我想通过添加映射转换器来修改此流,就好像我最初写的:
numbers.where((number) => number % 2 == 0);
Run Code Online (Sandbox Code Playgroud)
从现在开始,所有现有的听众都应该只接收偶数,而不会中断.如何才能做到这一点?
我使用postgres数据库查询来确定我的下一个操作.我需要等待结果才能执行下一行代码.现在我conn.query返回一个Future,但是当我将代码放在另一个函数中时,我无法将其设置为异步.
main() {
// get the database connection string from the settings.ini in the project root folder
db = getdb();
geturl().then((String url) => print(url));
}
Future geturl() {
connect(db).then((conn) {
conn.query("select trim(url) from crawler.crawls where content IS NULL").toList()
.then((result) { return result[0].toString(); })
.catchError((err) => print('Query error: $err'))
.whenComplete(() {
conn.close();
});
});
}
Run Code Online (Sandbox Code Playgroud)
我只是想geturl()等待返回的值,但无论我做什么; 它会立即发射.任何人都能指出我的一篇文档解释了我在这里缺少的东西吗?
在达特我能做到:
await HttpRequest.getString(path)
Run Code Online (Sandbox Code Playgroud)
这将返回一个字符串.
我想创建一个会做同样的方法,但是像这样:
HttpRequest request = new HttpRequest();
request
..open('Get',getPath)
..setRequestHeader('Content-Type','application/json')
..send('');
...
return responseString;
Run Code Online (Sandbox Code Playgroud)
我可以使用事件和期货来做到这一点,但我想了解如何使用async&await具体做到这一点.
编辑:这是针对浏览器的dart:html HttpRequest.
我在Dart中尝试了一些WebGL,我创建了一个从单独的文件加载着色器的类,我想在对象准备就绪时抛出一个事件(函数),所以我可以继续我的应用程序,因为我知道我的着色器已正确加载.有人知道一个简单的方法吗?
我正在使用Dart的Streams进行异步事件.我有两个流,我想知道两个流何时完成(也就是关闭).我想用Futures做这件事.我该怎么做?
在使用在计时器的帮助下自我更新的有状态小部件时,我一直面临一些与 setState 函数相关的问题。下面的代码显示了 2 个主要类,它们复制了我是如何发现此错误的。文本小部件“Lorem”应在 10 秒内插入 - 确实如此 - 但它从未显示。我尝试调试数组“Items”,它确实在 5 秒后包含“lorem”文本小部件,它应该如此。“构建”函数运行但在 UI 中没有任何区别。
class textList extends StatefulWidget {
@override
State<StatefulWidget> createState() =>
new _textListState();
}
class _textListState extends State<textList>
with TickerProviderStateMixin {
List<Widget> items = new List();
Widget lorem = new textClass("Lorem");
Timer timer;
@override
void initState() {
super.initState();
items.add(new textClass("test"));
items.add(new textClass("test"));
timer = new Timer.periodic(new Duration(seconds: 5), (Timer timer) {
setState(() {
items.removeAt(0);
items.add(lorem);
});
});
}
@override
void dispose() {
super.dispose(); …Run Code Online (Sandbox Code Playgroud) 这是情况的(简化)场景:
stream.listen((bool result) {
if (result) {
// should cancel the subscription
}
});
Run Code Online (Sandbox Code Playgroud)
我想停止收听到Stream根据其内容,但我不能换我脑袋一下就足以得出一个结论。
StreamSubscription streamSubscription = stream.listen((_) {});
streamSubscription.cancel(); // cancels the subscription
Run Code Online (Sandbox Code Playgroud)
随着cancel()我可以正常取消我,但我不能访问streamSubscription的listen回调。
我有一个消息流:一些是请求,其他是响应。我想从我的源创建 2 个流。
_responseStream = _sourceStream.transform(decoder).where((message) => message.isResponse());
_requestStream = _sourceStream.transform(decoder).where((message) => message.isRequest());
Run Code Online (Sandbox Code Playgroud)
这个解决方案优化了吗?(在性能或其他方面)。
提前致谢。
是否可以使用Timer而不是执行异步步骤Future.delayed?主要原因是类cancel()中方法的可用性Timer,它允许我在 Flutter 中处理小部件时取消正在运行的计时器。
import 'dart:async';
const kFirstStepDuration = Duration(seconds: 1);
const kSecondStepDuration = Duration(seconds: 1);
const kThirdStepDuration = Duration(seconds: 1);
void main() async{
await Future.delayed(kFirstStepDuration);
print('first step');
await Future.delayed(kSecondStepDuration);
print('second step');
await Future.delayed(kThirdStepDuration);
print('end');
}
Run Code Online (Sandbox Code Playgroud)
使用 Richard Heap 答案后的计时器,我想尽可能取消这些步骤,但下面的代码提示:
first timer to begin
cancel first
cancel second
cancel third
Run Code Online (Sandbox Code Playgroud)
我的期望是提示:
first timer to begin
cancel first
second timer to begin
cancel second
third timer to begin
cancel third
executed in 0:00:00.06000
Run Code Online (Sandbox Code Playgroud)
import …Run Code Online (Sandbox Code Playgroud)