Flutter/Dart 抽象类中能否定义静态方法或factory构造方法
Dart 抽象类静态方法与工厂构造方法答疑
结论先行
- Dart 抽象类支持定义静态方法,也支持定义factory构造方法,二者都属于类级别的调用逻辑,和抽象类不可直接实例化的特性不存在冲突。
- 但静态方法无法被子类继承或重写,抽象类原生的factory构造也不会自动适配子类逻辑,需要针对性设计才能满足你提出的子类JSON反序列化需求。
反序列化场景实现方案
你需要的子类独立反序列化能力,最常用的实现方式如下:
import 'dart:convert'; /// 抽象基类 abstract class BaseEntity { /// 抽象类可正常定义factory构造,作为统一的反序列化入口 factory BaseEntity.fromJson(Map<String, dynamic> json, Type subtype) { switch (subtype) { case User: return User.fromJson(json); case Article: return Article.fromJson(json); default: throw UnimplementedError('未实现$subtype类型的反序列化逻辑'); } } /// 抽象类也可定义静态工具方法,简化调用逻辑 static T deserialize<T extends BaseEntity>(String jsonStr, T Function(Map<String, dynamic>) subFromJson) { final jsonMap = jsonDecode(jsonStr); return subFromJson(jsonMap); } } /// 子类1:用户类 class User extends BaseEntity { final String uid; final String nickname; User({required this.uid, required this.nickname}); /// 子类自行实现自身的反序列化逻辑 factory User.fromJson(Map<String, dynamic> json) { return User( uid: json['uid'] as String, nickname: json['nickname'] as String, ); } } /// 子类2:文章类 class Article extends BaseEntity { final String title; final int readCount; Article({required this.title, required this.readCount}); factory Article.fromJson(Map<String, dynamic> json) { return Article( title: json['title'] as String, readCount: json['read_count'] as int, ); } }
调用示例
// 通过基类factory构造创建实例 User user = BaseEntity.fromJson({'uid': '123', 'nickname': '张三'}, User) as User; // 通过基类静态方法创建实例,无需强转 Article article = BaseEntity.deserialize<Article>('{"title": "测试文章", "read_count": 100}', Article.fromJson);
额外提示
如果你的项目子类数量较多,手动编写fromJson逻辑效率较低,可以搭配Dart官方的json_serializable代码生成工具自动生成各子类的反序列化代码,减少重复编码工作。
内容的提问来源于stack exchange,提问作者Filipe Piletti Plucenio
相关产品推荐
相关产品推荐

