Flutter/Dart如何实现带工厂方法的抽象类统一模型序列化接口
实现方案
Dart 语法层面不支持抽象类直接强制子类实现静态方法或工厂方法,因为这两类方法都是编译时解析的,不属于类的实例接口契约。我们可以通过泛型抽象基类 + 开发约定的方式满足需求,同时抽离公共逻辑减少重复代码。
第一步:定义泛型抽象基类
import 'package:equatable/equatable.dart'; abstract class BaseModel<T extends BaseModel<T>> extends Equatable { const BaseModel(); // 编译期强制子类实现toJson实例方法 Map<String, dynamic> toJson(); // 约定子类必须实现的fromJson工厂方法,未实现时调用会直接抛异常 factory T.fromJson(dynamic json) => throw UnimplementedError('子类未实现fromJson工厂方法'); // 通用列表反序列化逻辑,所有子类直接复用,无需重复实现 static List<T> listFromJson<T extends BaseModel<T>>(List<dynamic> json) { return json.map((item) => (T).fromJson(item) as T).toList(); } }
第二步:改造现有模型类适配基类
以你的Post模型为例,改造后代码如下,不需要再单独写listFromJson方法:
class Post extends BaseModel<Post> { Post({ required this.id, required this.title, }); final int id; final String title; @override List<Object> get props => [id, title]; // 实现基类约定的fromJson工厂 factory Post.fromJson(dynamic json) { return Post( id: json['id'] as int, title: json['name'] as String, ); } // 实现基类强制要求的toJson实例方法 @override Map<String, dynamic> toJson() { return { 'id': id, 'title': title, }; } }
使用方式
- 单个对象反序列化:
final post = Post.fromJson(jsonData); - 列表批量反序列化:
final postList = BaseModel.listFromJson<Post>(jsonListData);
注意事项
- 如果子类没有实现
fromJson工厂方法,调用时会直接抛出UnimplementedError,开发阶段就能快速发现问题 - 如果需要完全的编译期约束,以及减少手动写序列化代码的工作量,可以搭配
json_serializable等代码生成工具使用,自动生成相关模板代码
内容的提问来源于stack exchange,提问作者Danil
相关产品推荐
相关产品推荐

