使用json to dart插件生成Flutter Model类时遇'Dynamic未定义'错误
问题:JSON转Dart Model时出现"Undefined name 'Dynamic'"错误
错误场景
使用JSON转Dart插件生成Flutter Model类时,出现错误提示**"Undefined name 'Dynamic'"**,错误代码位于User类的fromJson方法中:
json['balance'].forEach((v) { _balance?.add(Dynamic.fromJson(v)); });
对应的JSON响应
{ "success": true, "en_message": "", "ar_message": "", "data": { "user": { "first_name": "name", "username": "", "email": "abc2@gmail.com", "type": 1, "address": "address", "role_id": 4, "verification_code": 7198, "verified": 0, "phone": "123456", "mobile": "123456", "category_id": "1", "company_name": "1", "trade_license": "1", "field": "1", "work_time": "1", "updated_at": "2022-08-25T11:07:16.000000Z", "created_at": "2022-08-25T11:07:16.000000Z", "id": 158, "balance": [] } }, "status": 200 }
生成的完整Model类代码
import 'dart:convert'; SignupResponse signupResponseFromJson(String str) => SignupResponse.fromJson(json.decode(str)); String signupResponseToJson(SignupResponse data) => json.encode(data.toJson()); class SignupResponse { SignupResponse({ bool? success, String? enMessage, String? arMessage, Data? data, int? status, }) { _success = success; _enMessage = enMessage; _arMessage = arMessage; _data = data; _status = status; } SignupResponse.fromJson(dynamic json) { _success = json['success']; _enMessage = json['en_message']; _arMessage = json['ar_message']; _data = json['data'] != null ? Data.fromJson(json['data']) : null; _status = json['status']; } bool? _success; String? _enMessage; String? _arMessage; Data? _data; int? _status; SignupResponse copyWith({ bool? success, String? enMessage, String? arMessage, Data? data, int? status, }) => SignupResponse( success: success ?? _success, enMessage: enMessage ?? _enMessage, arMessage: arMessage ?? _arMessage, data: data ?? _data, status: status ?? _status, ); bool? get success => _success; String? get enMessage => _enMessage; String? get arMessage => _arMessage; Data? get data => _data; int? get status => _status; Map<String, dynamic> toJson() { final map = <String, dynamic>{}; map['success'] = _success; map['en_message'] = _enMessage; map['ar_message'] = _arMessage; if (_data != null) { map['data'] = _data?.toJson(); } map['status'] = _status; return map; } } Data dataFromJson(String str) => Data.fromJson(json.decode(str)); String dataToJson(Data data) => json.encode(data.toJson()); class Data { Data({ User? user, }) { _user = user; } Data.fromJson(dynamic json) { _user = json['user'] != null ? User.fromJson(json['user']) : null; } User? _user; Data copyWith({ User? user, }) => Data( user: user ?? _user, ); User? get user => _user; Map<String, dynamic> toJson() { final map = <String, dynamic>{}; if (_user != null) { map['user'] = _user?.toJson(); } return map; } } User userFromJson(String str) => User.fromJson(json.decode(str)); String userToJson(User data) => json.encode(data.toJson()); class User { User({ String? firstName, String? username, String? email, int? type, String? address, int? roleId, int? verificationCode, int? verified, String? phone, String? mobile, String? categoryId, String? companyName, String? tradeLicense, String? field, String? workTime, String? updatedAt, String? createdAt, int? id, List<dynamic>? balance, }) { _firstName = firstName; _username = username; _email = email; _type = type; _address = address; _roleId = roleId; _verificationCode = verificationCode; _verified = verified; _phone = phone; _mobile = mobile; _categoryId = categoryId; _companyName = companyName; _tradeLicense = tradeLicense; _field = field; _workTime = workTime; _updatedAt = updatedAt; _createdAt = createdAt; _id = id; _balance = balance; } User.fromJson(dynamic json) { _firstName = json['first_name']; _username = json['username']; _email = json['email']; _type = json['type']; _address = json['address']; _roleId = json['role_id']; _verificationCode = json['verification_code']; _verified = json['verified']; _phone = json['phone']; _mobile = json['mobile']; _categoryId = json['category_id']; _companyName = json['company_name']; _tradeLicense = json['trade_license']; _field = json['field']; _workTime = json['work_time']; _updatedAt = json['updated_at']; _createdAt = json['created_at']; _id = json['id']; if (json['balance'] != null) { _balance = []; json['balance'].forEach((v) { _balance?.add(Dynamic.fromJson(v)); }); } } String? _firstName; String? _username; String? _email; int? _type; String? _address; int? _roleId; int? _verificationCode; int? _verified; String? _phone; String? _mobile; String? _categoryId; String? _companyName; String? _tradeLicense; String? _field; String? _workTime; String? _updatedAt; String? _createdAt; int? _id; List<dynamic>? _balance; User copyWith({ String? firstName, String? username, String? email, int? type, String? address, int? roleId, int? verificationCode, int? verified, String? phone, String? mobile, String? categoryId, String? companyName, String? tradeLicense, String? field, String? workTime, String? updatedAt, String? createdAt, int? id, List<dynamic>? balance, }) => User( firstName: firstName ?? _firstName, username: username ?? _username, email: email ?? _email, type: type ?? _type, address: address ?? _address, roleId: roleId ?? _roleId, verificationCode: verificationCode ?? _verificationCode, verified: verified ?? _verified, phone: phone ?? _phone, mobile: mobile ?? _mobile, categoryId: categoryId ?? _categoryId, companyName: companyName ?? _companyName, tradeLicense: tradeLicense ?? _tradeLicense, field: field ?? _field, workTime: workTime ?? _workTime, updatedAt: updatedAt ?? _updatedAt, createdAt: createdAt ?? _createdAt, id: id ?? _id, balance: balance ?? _balance, ); String? get firstName => _firstName; String? get username => _username; String? get email => _email; int? get type => _type; String? get address => _address; int? get roleId => _roleId; int? get verificationCode => _verificationCode; int? get verified => _verified; String? get phone => _phone; String? get mobile => _mobile; String? get categoryId => _categoryId; String? get companyName => _companyName; String? get tradeLicense => _tradeLicense; String? get field => _field; String? get workTime => _workTime; String? get updatedAt => _updatedAt; String? get createdAt => _createdAt; int? get id => _id; List<dynamic>? get balance => _balance; Map<String, dynamic> toJson() { final map = <String, dynamic>{}; map['first_name'] = _firstName; map['username'] = _username; map['email'] = _email; map['type'] = _type; map['address'] = _address; map['role_id'] = _roleId; map['verification_code'] = _verificationCode; map['verified'] = _verified; map['phone'] = _phone; map['mobile'] = _mobile; map['category_id'] = _categoryId; map['company_name'] = _companyName; map['trade_license'] = _tradeLicense; map['field'] = _field; map['work_time'] = _workTime; map['updated_at'] = _updatedAt; map['created_at'] = _createdAt; map['id'] = _id; if (_balance != null) { map['balance'] = _balance?.map((v) => v.toJson()).toList(); } return map; } }
原因分析与解决方案
错误原因
这个错误既不是你这边的问题,也不是后端的问题,而是JSON转Dart插件的逻辑缺陷:
- 后端返回的
balance是一个空数组,插件无法推断数组内元素的具体类型,错误地生成了不存在的Dynamic类来解析元素。 - Dart中并没有名为
Dynamic的内置类,插件的这种写法完全不符合语法规范。
修复步骤
你需要手动修改User类中的相关代码,有两种处理方式:
方式1:直接赋值数组(适用于暂时不需要解析数组元素的场景)
把fromJson中处理balance的代码改为直接赋值:
// 替换原有的balance解析逻辑 _balance = json['balance'] != null ? List<dynamic>.from(json['balance']) : null;
同时修改toJson中的对应代码(因为dynamic类型没有toJson方法):
// 替换原有的balance序列化逻辑 if (_balance != null) { map['balance'] = _balance; }
方式2:明确数组元素类型(如果后续后端会返回具体结构)
如果后续后端会给balance数组返回具体的对象结构,比如每个元素是带有amount和currency的对象,你可以先创建对应的模型类,再修改User类中的balance类型为该类的列表,例如:
// 先创建BalanceItem类 class BalanceItem { final double amount; final String currency; BalanceItem({required this.amount, required this.currency}); factory BalanceItem.fromJson(Map<String, dynamic> json) { return BalanceItem( amount: json['amount'], currency: json['currency'], ); } Map<String, dynamic> toJson() { return { 'amount': amount, 'currency': currency, }; } } // 然后修改User类中的相关代码 // 1. 构造函数和成员变量 List<BalanceItem>? _balance; User({ // ...其他参数 List<BalanceItem>? balance, }) { // ...其他赋值 _balance = balance; } // 2. fromJson方法 if (json['balance'] != null) { _balance = []; json['balance'].forEach((v) { _balance?.add(BalanceItem.fromJson(v)); }); } // 3. copyWith方法 User copyWith({ // ...其他参数 List<BalanceItem>? balance, }) => User( // ...其他参数 balance: balance ?? _balance, ); // 4. getter方法 List<BalanceItem>? get balance => _balance; // 5. toJson方法 if (_balance != null) { map['balance'] = _balance?.map((v) => v.toJson()).toList(); }
内容的提问来源于stack exchange,提问作者user12790690
相关产品推荐
相关产品推荐

