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

Flutter中使用Freezed包生成的泛型ApiResult类缺失when和map方法

Flutter中使用Freezed包生成的泛型ApiResult类缺失when和map方法

嘿,我之前也碰到过Freezed生成泛型类时丢失when/map方法的问题,咱们一步步来排查解决:

  • 先确认依赖版本兼容性
    有些旧版本的Freezed对泛型密封类的支持存在bug,建议把相关依赖更新到最新稳定版,调整pubspec.yaml:

    dependencies:
      freezed_annotation: ^2.4.1
      json_annotation: ^4.8.1
    
    dev_dependencies:
      build_runner: ^2.4.6
      freezed: ^2.4.5
      json_serializable: ^6.7.1
    

    更新后记得执行flutter pub get拉取新依赖。

  • 彻底清理并重新生成代码
    旧的生成文件缓存很可能是问题根源,一定要用带清理参数的命令重新生成:

    flutter pub run build_runner build --delete-conflicting-outputs
    

    这个命令会删掉之前生成的冲突文件,确保新生成的代码完全匹配当前的类定义。

  • 调整类定义的写法
    你的代码写法本身没问题,但可以试试把sealed换成abstract(Freezed对两种写法都支持,部分场景下abstract更稳妥):

    import 'package:freezed_annotation/freezed_annotation.dart';
    
    part 'api_result.freezed.dart';
    
    @freezed
    abstract class ApiResult<T> with _$ApiResult<T> {
      const factory ApiResult.success(T data) = Success<T>;
      const factory ApiResult.failure(String msg) = Failure<T>;
    }
    
  • 查看生成时的控制台日志
    运行build_runner命令时,仔细看控制台有没有报错信息,比如语法错误、依赖缺失之类的,这些都可能导致代码生成不完整。

另外,使用的时候要记得明确指定泛型类型,比如:

final result = ApiResult<String>.success("测试数据");
result.when(
  success: (data) => print("成功:$data"),
  failure: (msg) => print("失败:$msg"),
);

备注:内容来源于stack exchange,提问作者Mohamed Yaseen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:14:37