使用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, ); }
问题分析与修复建议
从报错栈看,错误出现在请求体类型处理环节,结合代码细节,可按以下方向排查:
替换
Map<String, dynamic>请求体
代码中updateAadhaar和updateLoanGeneralInfo方法使用动态Map作为请求体,Retrofit生成器对这种类型的兼容性较差。建议定义对应的数据模型类,添加JsonSerializable注解,用模型类替代Map参数。检查模型类的正确性
- 核对所有模型类名拼写(比如
Covercreditdatarespose是否存在大小写或拼写错误) - 确认模型类已添加
JsonSerializable注解,且对应的.g.dart文件已正常生成 - 检查模型类的导入路径是否正确,无拼写错误
- 核对所有模型类名拼写(比如
调整Retrofit依赖版本
该空值错误可能是retrofit_generator的版本bug,在pubspec.yaml中切换到稳定兼容的版本组合(比如retrofit: ^4.0.3+retrofit_generator: ^7.0.0,需适配你的Dart/Flutter版本),执行flutter pub get后重新生成代码。单独生成目标文件
尝试只针对该文件执行生成命令,避免其他文件干扰:dart run build_runner build --build-filter="cover_credit_client.dart"
内容的提问来源于stack exchange,提问作者Prathamesh Mali
相关产品推荐
相关产品推荐

