首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.listen().onError().onDone()出现Dart流错误

.listen().onError().onDone()出现Dart流错误
EN

Stack Overflow用户
提问于 2020-01-18 05:14:45
回答 1查看 1.5K关注 0票数 3

我对一些看起来像这样的代码有一个问题。在此表单中,我有一个错误

The expression here has a type of 'void', and therefore can't be used. Try checking to see if you're using the correct API; there might be a function or call that returns void you didn't expect. Also check type parameters and variables which might also be void.dart(use_of_void_result)

如果我删除.onDone(),错误就会消失。为什么?请使用ELI5 :-)我一直在看https://api.dart.dev/stable/2.7.0/dart-async/Stream/listen.html,但似乎还是误解了一些东西。我还阅读了https://api.dart.dev/stable/2.7.0/dart-async/StreamSubscription/onDone.html

代码语言:javascript
复制
serviceName.UploadThing(uploadRequest).listen((response) {
  uploadMessageOutput = response.message;
  if (response.uploadResult) {
    showSuccess();
  } else {
    showError();
  }
  getUploadFileList(event);

  isSaveInProgress = false;
}).onError((error) {
  isSaveInProgress = false;
  _handleFileUploadError(uploadRequest, error);
}).onDone(() {
  isSaveInProgress = false;
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-18 05:21:25

您的代码几乎是正确的,但只需要简单的更改即可正常工作。

如果您交换了onErroronDone的顺序,您将看到相同的错误,因此该问题与您的流使用无关。但是,您试图将对onError的调用和对onDone的调用链接在一起,这将不起作用,因为这两个方法都返回void

您正在寻找的是cascade notation (..),它允许您将调用链接到listen()返回的StreamSubscription。下面是你的代码应该是什么样子:

代码语言:javascript
复制
serviceName.UploadThing(uploadRequest).listen((response) {
  uploadMessageOutput = response.message;
  if (response.uploadResult) {
    showSuccess();
  } else {
    showError();
  }
  getUploadFileList(event);

  isSaveInProgress = false;
})..onError((error) { // Cascade
  isSaveInProgress = false;
  _handleFileUploadError(uploadRequest, error);
})..onDone(() {       // Cascade
  isSaveInProgress = false;
});
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59794932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档