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

使用Retrofit生成API Client时遭遇Null Check空值错误

Retrofit生成API Client文件时触发“Null check operator used on null value”错误

尝试用Retrofit生成API Client文件时,单个特定文件报错Null check operator used on null value,其他文件可正常生成。VS Code未提示任何语法错误。

详细报错日志

Null check operator used on null value
package:source_gen/src/type_checker.dart 215:74             TypeChecker.isSuperTypeOf
package:retrofit_generator/src/generator.dart 1675:49       RetrofitGenerator._generateRequestBody
package:retrofit_generator/src/generator.dart 477:5         RetrofitGenerator._generateRequest
package:retrofit_generator/src/generator.dart 429:17        RetrofitGenerator._generateMethod.<fn>
package:code_builder/src/specs/method.g.dart 323:33         _$MethodBuilder.update
package:code_builder/src/specs/method.g.dart 38:29          new _$Method
package:retrofit_generator/src/generator.dart 379:12        RetrofitGenerator._generateMethod
package:retrofit_generator/src/generator.dart 235:21        RetrofitGenerator._parseMethods.<fn>
dart:core                                                   List.addAll
package:built_collection/src/list/list_builder.dart 98:14   ListBuilder.addAll
package:retrofit_generator/src/generator.dart 118:19        RetrofitGenerator._implementClass.<fn>
package:code_builder/src/specs/class.g.dart 345:33          _$ClassBuilder.update
package:code_builder/src/specs/class.g.dart 40:28           new _$Class
package:retrofit_generator/src/generator.dart 104:26        RetrofitGenerator._implementClass
package:retrofit_generator/src/generator.dart 89:12         RetrofitGenerator.generateForAnnotatedElement
package:source_gen/src/generator_for_annotation.dart 61:30  GeneratorForAnnotation.generate
package:source_gen/src/builder.dart 342:33                  _generate
dart:async                                                  Stream.toList.<fn>
package:source_gen/src/builder.dart 107:9                   _Builder._generateForLibrary
package:source_gen/src/builder.dart 99:5                    _Builder.build

已尝试的无效操作

  • 执行flutter clean
  • 执行flutter pub get
  • 执行flutter pub cache clean后重新运行build_runner

目标文件代码

import 'package:dio/dio.dart'; 
import 'package:eazr/core/constants/api_string.dart'; 
import 'package:eazr/features/cover_credit/data/model/cover_credit_mark_disburse_res_model.dart'; 
import 'package:eazr/features/cover_credit/data/model/cover_credit_update_general_info_model.dart'; 
import 'package:eazr/features/cover_credit/data/model/get_cover_credit_res_model.dart'; 
import 'package:eazr/features/cover_credit/data/model/get_nach_mandate_res_model.dart'; 
import 'package:eazr/features/cover_credit/data/model/get_nach_update_res_model.dart'; 
import 'package:eazr/features/cover_credit/data/model/request/cover_credit_aadhar_verify_otp_req_model.dart'; 
import 'package:eazr/features/cover_credit/data/model/request/cover_credit_pre_approved_emi_req_model.dart'; 
import 'package:eazr/features/cover_credit/data/model/request/insurance_eligibility_check_req_model.dart'; 
import 'package:eazr/features/cover_credit/data/model/response/cover_creddit_data_res_model.dart'; 
import 'package:eazr/features/cover_credit/data/model/response/cover_credit_agreement_res_model.dart'; 
import 'package:eazr/features/cover_credit/data/model/response/cover_credit_kyc_res_model.dart'; 
import 'package:eazr/features/cover_credit/data/model/response/cover_credit_pre_approved_emi_res_model.dart'; 
import 'package:eazr/features/cover_credit/data/model/response/insurance_eligibility_check_res_model.dart'; 
import 'package:eazr/features/cover_credit/data/model/response/insurance_provider_res_model.dart'; 
import 'package:retrofit/retrofit.dart';

part 'cover_credit_client.g.dart';

@RestApi() 
abstract class CoverCreditClient {   
  factory CoverCreditClient(Dio dio) = _CoverCreditClient;

  @GET(ApiString.providerList)   
  Future<InsuranceProviderResModel> getProviderList(
    @Header('authorization') String authToken,   
  );

  @POST(ApiString.postInsuranceEligibility)   
  Future<InsuranceEligibilityCheckResponseModel> postInsuranceEligibility(
    @Header('authorization') String authToken,
    @Body() InsuranceEligibilityCheckRequestModel body,   
  );

  @GET(ApiString.getInsuranceGeneralInfo)   
  Future<Covercreditdatarespose> getInsuranceGeneralInfo(
    @Header('authorization') String authToken,
    @Path("insuranceInfoId") int id,   
  );

  @POST(ApiString.coverLoanKyc)   
  Future<CoverCreditKycResponseModel> verifyAadhaarOtp(
    @Path("id") int applicationId,
    @Header('authorization') String authToken,
    @Body() CoverCreditAadharVerifyOtpReqModel body,   
  );

  @POST(ApiString.coverLoanKyc)   
  Future<CoverCreditKycResponseModel> updateAadhaar(
    @Path("id") int applicationId,
    @Header('authorization') String authToken,
    @Body() Map<String, dynamic> body,   
  );

  @GET(ApiString.coverCreditResendOtp)   
  Future<CoverCreditKycResponseModel> resendOtp(
    @Header('authorization') String authToken,
    @Path("id") int applicationId,   
  );

  @POST(ApiString.coverCreditGeneralInfo)   
  Future<CoverCreditUpdateGeneralInfoModel> updateLoanGeneralInfo(
    @Path("id") int applicationId,
    @Header('authorization') String authToken,
    @Body() Map<String, dynamic> body,   
  );

  @GET(ApiString.getDesginationList)   
  Future<List<String>> getDesignationList();

  @GET(ApiString.getIndustryList)   
  Future<List<String>> getIndustryList();

  @GET(ApiString.coverCashAgreement)   
  Future<CoverCreditAgreementResModel> getInstacashAgreement(
    @Header('authorization') String authToken,   
  );

  @POST(ApiString.postCoverCreditPreApprovedLoan)   
  Future<CoverCreditPreApprovedEmiResModel> postPreApprovedLoan(
    @Header('authorization') String authToken,
    @Path("insuranceInfoId") int loanApplicationId,
    @Body() CoverCreditPreApprovedReqModel body,   
  );

  @GET(ApiString.getCoverCreditNachDetails)   
  Future<CoverCreditGetNachMandadeDetailsResponseModel> getNachDetails(
    @Header('authorization') String authToken,
    @Path("insuranceInfoId") int loanApplicationId,   
  );

  @GET(ApiString.getCoverCreditNachUpdate)   
  Future<CoverCreditGetNachUpateResponseModel> getNachUpdate(
    @Header('authorization') String authToken,
    @Path("insuranceInfoId") int loanApplicationId,   
  );

  @GET(ApiString.getCoverCreditInfo)   
  Future<GetCoverCreditInfoResModel> getCoverCreditInfo(
    @Header('authorization') String authToken,   
  );

  @GET(ApiString.getCoverCreditMarkDisbure)   
  Future<CoverCreditGetMarkDisburseResponseModel> getMarkDisburse(
    @Header('authorization') String authToken,
    @Path("insuranceInfoId") int insuranceInfoId,   
  ); 
}

问题分析与修复建议

从报错栈看,错误出现在请求体类型处理环节,结合代码细节,可按以下方向排查:

  1. 替换Map<String, dynamic>请求体
    代码中updateAadhaar和updateLoanGeneralInfo方法使用动态Map作为请求体,Retrofit生成器对这种类型的兼容性较差。建议定义对应的数据模型类,添加JsonSerializable注解,用模型类替代Map参数。

  2. 检查模型类的正确性

    • 核对所有模型类名拼写(比如Covercreditdatarespose是否存在大小写或拼写错误)
    • 确认模型类已添加JsonSerializable注解,且对应的.g.dart文件已正常生成
    • 检查模型类的导入路径是否正确,无拼写错误
  3. 调整Retrofit依赖版本
    该空值错误可能是retrofit_generator的版本bug,在pubspec.yaml中切换到稳定兼容的版本组合(比如retrofit: ^4.0.3 + retrofit_generator: ^7.0.0,需适配你的Dart/Flutter版本),执行flutter pub get后重新生成代码。

  4. 单独生成目标文件
    尝试只针对该文件执行生成命令,避免其他文件干扰:

    dart run build_runner build --build-filter="cover_credit_client.dart"
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:49:58