如何从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
相关产品推荐
相关产品推荐

