标签: dart-async

Dart 中的 Stream<List<int>> 和 Stream<int> 有什么区别

我正在尝试围绕 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)
  1. Stream<T>as的声明Stream<List<int>>让我有点困惑。为什么不将其声明为Stream<int>. List<> 类型如何使它与众不同。如果是列表,订阅者事件是否以某种方式缓冲?

  2. 什么类型(如<T>)被传递给第一个转换?它是一个int还是一个List<int>

  3. 传递给每个下一个转换的类型以及决定它们的类型的因素。

  4. 此示例是否在将转换结果传递给下一个转换之前读取整个文件?如果是这样,是否有关于如何流式传输非常大的文件的示例,类似于这个 Node 问题Parsing large logfiles in Node.js - read …

dart dart-async

4
推荐指数
1
解决办法
2219
查看次数

Dart:如何将变压器附加到现有流?

我正在寻找一种方法来以编程方式将变换器添加到已经正在侦听的现有流中.

例:

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)

从现在开始,所有现有的听众都应该只接收偶数,而不会中断.如何才能做到这一点?

stream dart dart-async

4
推荐指数
2
解决办法
952
查看次数

等待将来完成

我使用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()等待返回的值,但无论我做什么; 它会立即发射.任何人都能指出我的一篇文档解释了我在这里缺少的东西吗?

dart dart-async

4
推荐指数
2
解决办法
1万
查看次数

从HttpRequest返回字符串

在达特我能做到:

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 dart-html dart-async

4
推荐指数
1
解决办法
661
查看次数

如何在Dart上准备好对象时调度事件?

我在Dart中尝试了一些WebGL,我创建了一个从单独的文件加载着色器的类,我想在对象准备就绪时抛出一个事件(函数),所以我可以继续我的应用程序,因为我知道我的着色器已正确加载.有人知道一个简单的方法吗?

dart dart-html dart-async

3
推荐指数
1
解决办法
216
查看次数

我怎么知道两个Streams何时完成?

我正在使用Dart的Streams进行异步事件.我有两个流,我想知道两个流何时完成(也就是关闭).我想用Futures做这件事.我该怎么做?

dart dart-async

3
推荐指数
1
解决办法
461
查看次数

setState 不更新用户界面

在使用在计时器的帮助下自我更新的有状态小部件时,我一直面临一些与 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)

dart dart-async flutter

3
推荐指数
1
解决办法
5772
查看次数

从回调内部取消 StreamSubscription

这是情况的(简化)场景

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()我可以正常取消我,但我不能访问streamSubscriptionlisten回调。

dart dart-async

3
推荐指数
1
解决办法
734
查看次数

在 Dart 中将单个订阅流拆分为 2 个流

我有一个消息流:一些是请求,其他是响应。我想从我的源创建 2 个流。

_responseStream = _sourceStream.transform(decoder).where((message) => message.isResponse());
_requestStream = _sourceStream.transform(decoder).where((message) => message.isRequest());
Run Code Online (Sandbox Code Playgroud)

这个解决方案优化了吗?(在性能或其他方面)。

提前致谢。

dart dart-async

3
推荐指数
1
解决办法
1179
查看次数

使用 Timer 而不是 Future.delayed(...) 创建异步等待步骤

是否可以使用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)

timer dart dart-async flutter

3
推荐指数
1
解决办法
3521
查看次数

标签 统计

dart ×10

dart-async ×10

dart-html ×2

flutter ×2

stream ×1

timer ×1