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

Freezed .when方法返回Future.value值为null及返回值覆盖问题求助

问题解决方法

核心问题分析

  1. 原getCartData返回Future<void>,所以then回调中拿到的value必然是null——因为void类型的Future完成后没有返回值。
  2. 改为Future<ActionEnum>时,未正确返回cartData.when的结果,且未覆盖所有分支的返回逻辑,导致编译器要求额外返回值。

修改后的代码

CartRepository类

class CartRepository {
  Future<ActionEnum> getCartData(Map<String, Object> requestData) async {
    CartEndPoint cart = CartEndPoint();
    cart.requestBody = requestData;
    try {
      // 修正笔误:原loginEnd应为cart
      NetworkResponse cartData = await apiManager.fetchData(cart);
      
      // 返回when方法的结果,确保每个分支都处理返回或抛出异常
      return cartData.when(
        success: (response) {
          // async方法会自动将返回值包装为Future,无需手动Future.value
          return ActionEnum.cartFetched;
        },
        loading: (message) {
          print("loading -  ${message}");
          // 根据业务需求处理:要么抛出异常,要么返回对应Action枚举
          throw Exception("加载购物车数据中");
          // 若有对应枚举值,也可改为:return ActionEnum.loading;
        },
        error: (error) {
          print("error -  ${error.message}");
          throw error;
        },
      );
    } catch (error) {
      rethrow;
    }
  }
}

_CartScreenState类的fetchCart方法

void fetchCart() {
  CartRepository().getCartData(requestData)
    .then((value) {
      switch (value) {
        case ActionEnum.cartFetched:
          // 执行下一步操作
          break;
        // 若添加了loading枚举,可在此处理
        // case ActionEnum.loading:
        //   // 处理加载状态
        //   break;
      }
      widget.onChange(true);
    })
    .onError((error, stackTrace) {
      print(error);
    });
}

关键修改点

  • 将getCartData的返回类型改为Future<ActionEnum>,明确返回值类型。
  • 直接返回cartData.when的结果,让success分支的枚举值成为Future的最终返回值。
  • 为when的每个分支补全逻辑:success返回目标枚举,loading/error分支要么抛出异常,要么返回对应枚举,确保编译器不会要求额外的返回值。
  • 移除不必要的Future.value,async方法会自动将同步返回值包装为Future。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:58:29