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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:06:32