Freezed .when方法返回Future.value值为null及返回值覆盖问题求助
问题解决方法
核心问题分析
- 原
getCartData返回Future<void>,所以then回调中拿到的value必然是null——因为void类型的Future完成后没有返回值。 - 改为
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
相关产品推荐
相关产品推荐

