A library that generate some standard functionality and utility functions for Model(similar to Data Class in Kotlin)


  • @Json() / @json : An annotation that add an extended json field to the model to convert the current model instance into standard JSON.

  • @SerializedName('name'') : An annotation that indicates this member should be serialized to JSON with the provided name value as its field name(similar to SerializedName in Gson).

  • @Copy() / @copy : An annotation that add an extended function to the model to copy an object altering some of its properties.

  • @ToString() / @toString : An annotation that add an extended function (named toString2) to generate a string with form like "User(name=John, age=42)".


  • step 1: Define a model class and add one or more of @Json() / @json || @Copy() / @copy || @ToString() / @toString to the model class.


import 'package:auto_model/auto_model.dart';

import 'student.dart';
import 'teacher.dart';

part 'class.g.dart';

class Class {
  String name;
  List<Student> students;
  Teacher headTeacher;

  int get studentCount => students?.length;

  /// required empty ctr if use @toString

  Class.require(this.name, this.headTeacher, {this.students});

  • step 2: In module directory, run:
$ pub get
$ pub run build_runner build
  • When the command finishes executing, a dart standard source code file with a suffix of *.g.dart will be generated. The code will generate an extension class that contains the corresponding function or field, as follows:



part of 'class.dart';

// **************************************************************************
// CopyGenerator
// **************************************************************************

extension $CopyClassExtension on Class {
  /// Used for copy an object altering some of its properties,
  /// but keeping the rest unchanged.
  Class copy({String name, List<Student> students, Teacher headTeacher}) {
    var copied = Class(); // ignore: prefer_final_locals
    if (name != null) {
      copied.name = name;
    } else {
      copied.name = this.name;

    if (students != null) {
      copied.students = students;
    } else {
      copied.students = this.students;

    if (headTeacher != null) {
      copied.headTeacher = headTeacher;
    } else {
      copied.headTeacher = this.headTeacher;

    return copied;

// **************************************************************************
// JsonGenerator
// **************************************************************************

extension $JsonClassExtension on Class {
  /// import 'package:auto_model/auto_model.dart';
  String get json => toJson(this);

// **************************************************************************
// ToStringGenerator
// **************************************************************************

extension $ToStringClassExtension on Class {
  /// Used for generate a string with all available fields form like
  /// "User(name=John, age=42)".
  String toString2() {
    return 'Class(name=$name, students=$students, headTeacher=$headTeacher, studentCount=$studentCount)';

Later plans

Plan to merge these annotations together and generate them in an extension class

Features and bugs

Please file feature requests and bugs at the issue tracker.