在Flutter中使用fpdart时,如何无需折叠响应直接获取成败数据?
在Flutter中直接提取fpdart Either的成功/错误值
针对你的需求,无需通过getRight()/getLeft()返回的Option间接取值,可通过以下几种方式直接获取Either的左右值:
1. 使用match方法(推荐)
match是Either最常用的取值方式,能直接分别处理成功(Right)和错误(Left)场景,完全不需要处理Option:
void main() async { final res = await getData(); // 直接拿到错误信息或成功数据 res.match( // 处理Left(错误),参数就是错误字符串 (error) => print('获取数据失败:$error'), // 处理Right(成功),参数就是目标int值 (data) => print('获取数据成功:$data'), ); }
2. 确定结果类型时直接取值
如果你能提前确定当前Either的类型(比如已做前置判断),可以结合getRight()/getLeft()和Option的方法直接提取值:
获取成功值(Right)
void main() async { final res = await getData(); // 取成功值,失败时返回默认值0 final successData = res.getRight().getOrElse(() => 0); // 或者用getOrNull,失败时返回null final successDataOrNull = res.getRight().getOrNull(); }
获取错误信息(Left)
void main() async { final res = await getData(); // 取错误信息,成功时返回默认字符串 final errorMsg = res.getLeft().getOrElse(() => '无错误'); // 或者用getOrNull,成功时返回null final errorMsgOrNull = res.getLeft().getOrNull(); }
3. 使用fold方法
fold和match功能完全一致(fpdart中match是fold的别名),同样能直接处理两边的取值逻辑:
void main() async { final res = await getData(); final result = res.fold( (error) => '失败:$error', (data) => '成功:$data', ); print(result); }
你的原数据请求函数可保持不变:
Future<Either<String, int>> getData() async { try { int data = await Future.delayed(Duration(seconds: 3), () => 15); return right(data); } catch (err) { return left(err.toString()); } }
内容的提问来源于stack exchange,提问作者Abel
相关产品推荐
相关产品推荐

