Dart中如何通过向构造函数传入Map来创建对象
Dart 通过 Map 初始化对象的实现方案
Dart 默认不支持直接将 Map 传入默认命名参数构造函数创建实例,可通过以下几种方式实现需求:
方案1:自定义fromMap命名构造函数(官方生态通用规范)
这是Dart开发中最常用的写法,不影响原有命名参数构造的使用,兼容多场景初始化需求:
class User { final String? id; final String? name; // 原有命名参数构造保留 User({this.id, this.name}); // 新增fromMap命名构造,专门处理Map转实例的逻辑 User.fromMap(Map<String, dynamic> map) : id = map['id'] as String?, name = map['name'] as String?; } // 调用方式 final map = {'id': '1323', 'name': 'foo'}; User foo = User.fromMap(map);
方案2:改造主构造函数(匹配示例中的调用写法)
如果你确定只需要通过Map初始化实例,可以直接修改主构造函数的参数:
class User { final String? id; final String? name; // 主构造直接接收Map参数 User(Map<String, dynamic> map) : id = map['id'] as String?, name = map['name'] as String?; } // 完全符合期望的调用方式 final map = {'id': '1323', 'name': 'foo'}; User foo = User(map);
注意:该写法会导致你无法再使用原有命名参数的调用方式(如
User(id: "1", name: "bar")),如果需要同时支持两种初始化方式,优先选择方案1。
如果你的类字段较多,手动编写映射逻辑容易出错,可以使用json_serializable等Dart官方推荐的序列化代码生成库,自动生成解析逻辑,降低手写错误率。
内容的提问来源于stack exchange,提问作者Vingtoft
相关产品推荐
相关产品推荐

