You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Flutter的download函数返回Either<success,failure>类型值?

实现异步Stream完成/错误时返回Either类型结果

首先要明确:你的原函数是同步返回Either<Success, Failure>,但response.stream.listen是异步操作,同步函数不可能等待异步流程结束再返回结果,所以必须把函数返回类型改成Future<Either<Success, Failure>>,用Completer来手动控制异步结果的返回。

具体实现代码如下:

import 'dart:async';
import 'package:dartz/dartz.dart'; // 假设你使用dartz库的Either类型

Future<Either<Success, Failure>> download() {
  final completer = Completer<Either<Success, Failure>>();
  Http.StreamedResponse response; // 注意先正确初始化response实例,比如通过http请求获取

  response.stream.listen(
    (chunk) {
      sink.add(chunk);
    },
    onDone: () {
      // 流执行完成时返回成功结果
      completer.complete(const Right(Success()));
    },
    onError: (error) {
      // 出现错误时返回失败结果,可将错误信息封装到Failure中
      completer.complete(Left(Failure(error.toString())));
    },
    cancelOnError: true, // 可选:遇到错误立即取消流监听,避免后续无效事件
  );

  return completer.future;
}

// 假设你定义的Success和Failure类型如下
class Success {}
class Failure {
  final String message;
  Failure(this.message);
}

关键说明:

  • Completer是Dart里用来手动控制Future完成状态的工具,刚好适配流回调的异步场景,我们通过它传递最终的Either结果。
  • Right对应成功状态、Left对应失败状态是dartz库的约定,如果你用的是自定义Either类型,调整对应的成功/失败构造逻辑即可。
  • 务必提前正确初始化response实例(比如通过http.get()等方法获取StreamedResponse),否则会触发空指针错误。

内容的提问来源于stack exchange,提问作者May

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:06:30