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,因此抛出类型转换异常。
修复步骤
检查并修正序列化注解
确保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格式数据。重新生成序列化代码
执行以下命令重新生成.g.dart文件,确保注解生效:flutter pub run build_runner build --delete-conflicting-outputs验证序列化结果
再次调用object.toJson(),检查maintenanceRequestsList的元素是否为Map格式,而非字符串。可选优化:直接传递对象
GetX支持直接传递对象,无需手动序列化/反序列化,可简化流程:- 传递时:
Get.toNamed('rootName', arguments: object) - 接收时:
maintenanceSuperRequest = Get.arguments as MaintenanceSuperRequest
这种方式避免了序列化过程中可能出现的问题,更简洁高效。
- 传递时:
内容的提问来源于stack exchange,提问作者Abanoub Refaat
相关产品推荐
相关产品推荐

