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

Flutter使用json_serializable传参时类型转换异常问题求助

问题:使用json_serializable与GetX传递对象时出现序列化类型转换异常

问题背景

  • 基于json_serializable: ^6.3.1自动生成toJson()和fromJson()方法,定义了继承自DetailedRequest的MaintenanceSuperRequest类,其中包含List<MaintenanceRequest>类型的maintenanceRequestsList字段;MaintenanceRequest类也已生成对应序列化方法。
  • 使用get: ^4.6.3做状态管理,通过Get.toNamed('rootName', arguments: object.toJson())传递对象数据,但调用maintenanceSuperRequest = MaintenanceSuperRequest.fromJson(Get.arguments)时抛出异常:
    Exception type 'MaintenanceRequest' is not a subtype of type 'Map<String, dynamic>' in type cast
    

错误栈信息

Exception type 'MaintenanceRequest' is not a subtype of type 'Map<String, dynamic>' in type cast
Stack Trace 
#0      _$MaintenanceSuperRequestFromJson.<anonymous closure> (package:real_estate/models/requests/maintenance_req/maintenance_super_request.g.dart:14:53)
#1      MappedListIterable.elementAt (dart:_internal/iterable.dart:413:31)
#2      ListIterator.moveNext (dart:_internal/iterable.dart:342:26)
#3      new _GrowableList._ofEfficientLengthIterable (dart:core-patch/growable_array.dart:189:27)
#4      new _GrowableList.of (dart:core-patch/growable_array.dart:150:28)
#5      new List.of (dart:core-patch/array_patch.dart:51:28)
#6      ListIterable.toList (dart:_internal/iterable.dart:213:44)
#7      _$MaintenanceSuperRequestFromJson (package:real_estate/models/requests/maintenance_req/maintenance_super_request.g.dart:15:12)
#8      new MaintenanceSuperRequest.fromJson (package:real_estate/models/requests/maintenance_req/maintenance_super_request.dart:52:7)
#9      ConfirmMaintenanceCompletionController.onInit (package:real_estate/controllers/common/confirm_maintenance_completion_controller.dart:17:58)
#10     GetLifeCycleBase._onStart (package:get/get_instance/src/lifecycle.dart:66:5)
#11     InternalFinalCallback.call (package:get/get_instance/src/lifecycle.dart:12:26)
#12     GetInstance._startController (package:get/get_instance/src/get_instance.dart:253:16)
#13     GetInstance._initDependencies (package:get/get_instance/src/get_instance.dart:204:11)
#14     GetInstance.find (package:get/get_instance/src/get_instance.dart:301:17)
#15     GetInstance.put (package:get/get_instance/src/get_instance.dart:86:12)
#16     Inst.put (package:get/get_instance/src/extension_instance.dart:89:21)
#17     ConfirmMaintenanceCompletionPage.build (package:real_estate/views/common/confirm_maintenance_completion_page.dart:13:67)
#18     StatelessElement.build (package:flutter/src/widgets/framework.dart:4876:49)
#19     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4806:15)
#20     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#21     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4787:5)
#22     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4781:5)
#23     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3817:16)
#24     Element.updateChild (package:flutter/src/widgets/framework.dart:3551:18)
#25     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6215:14)
#26     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3817:16)
#27     Element.updateChild (package:flutter/src/widgets/framework.dart:3551:18)
#28     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#29     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#30     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4787:5)

补充细节

  • 从API获取数据时,使用(json.decode(response.body) as List).map((data) => MaintenanceSuperRequest.fromJson(data)).toList()可正常解析。
  • 查看MaintenanceSuperRequest.toJson()生成的数据发现,maintenanceRequestsList中的元素并非Map格式,而是MaintenanceRequest对象的字符串形式:
args {
//...... 其他数据    
services: [Safety, Plumbing, Elevator, Landline_Satellite],

maintenanceRequestsList: [SP Key 121212121266xy@s.com
Cost 50.0
Service Safety
Is Completed false, SP Key 121212121266xy@s.com
Cost 80.0
Service Plumbing
Is Completed false, SP Key 
Cost 0.0
Service Elevator
Is Completed false, SP Key 
Cost 0.0
Service Landline_Satellite
Is Completed false]}

解决方案

问题根源

MaintenanceSuperRequest类中maintenanceRequestsList字段的序列化配置存在问题,导致toJson()没有将列表内的MaintenanceRequest对象转换为Map,而是直接调用了对象的toString()方法生成字符串元素,反序列化时无法将字符串转为Map,因此抛出类型转换异常。

修复步骤

  1. 检查并修正序列化注解
    确保MaintenanceSuperRequest类的注解配置正确,让json_serializable能够正确处理列表中的MaintenanceRequest对象:

    import 'package:json_annotation/json_annotation.dart';
    import 'maintenance_request.dart';
    
    part 'maintenance_super_request.g.dart';
    
    @JsonSerializable()
    class MaintenanceSuperRequest extends DetailedRequest {
      final List<MaintenanceRequest> maintenanceRequestsList;
    
      MaintenanceSuperRequest({required this.maintenanceRequestsList});
    
      factory MaintenanceSuperRequest.fromJson(Map<String, dynamic> json) =>
          _$MaintenanceSuperRequestFromJson(json);
    
      @override
      Map<String, dynamic> toJson() => _$MaintenanceSuperRequestToJson(this);
    }
    

    注意:若MaintenanceRequest类不在同一文件,需确保正确导入,且该类的toJson()方法能正常生成Map格式数据。

  2. 重新生成序列化代码
    执行以下命令重新生成.g.dart文件,确保注解生效:

    flutter pub run build_runner build --delete-conflicting-outputs
    
  3. 验证序列化结果
    再次调用object.toJson(),检查maintenanceRequestsList的元素是否为Map格式,而非字符串。

  4. 可选优化:直接传递对象
    GetX支持直接传递对象,无需手动序列化/反序列化,可简化流程:

    • 传递时:Get.toNamed('rootName', arguments: object)
    • 接收时:maintenanceSuperRequest = Get.arguments as MaintenanceSuperRequest
      这种方式避免了序列化过程中可能出现的问题,更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:55:14