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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:19:59