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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:57:03