/dart_dataclass

Dart data class (equals, hashCode, toString, copyWith) methods generator

Primary LanguageDartMIT LicenseMIT

DEPRECATED

This package is no longer mantained. Consider using Freezed package to define your data classes.

dataclass

License Github Stars

Packages Versions on PUB

  • dataclass - Pub Version
  • dataclass_generator - Pub Version

@DataClass annotation used for dataclass_generator

The DataClass generator generates base class for your data class with methods:

  • equals (operator ==)
  • hashCode
  • toString
  • copyWith

Getting Started

0. Add dependencies to pubspec.yaml

dependencies:
  dataclass: latest_version
dev_dependencies:
  dataclass_generator: latest_version

1. Annotate your class with @dataClass

The class should:

  • has only final fields
  • unnamed constructor with named parameters for all fields
@dataClass
class Car {
  final String name;
  final String manufacturer;
  final double price;

  Car({this.name, this.manufacturer, this.price});
}

2. Generate dataclass base class

Run pub run build_runner build

Generated file

abstract class _$Car {
  const _$Car();

  String get name;
  String get manufacturer;
  double get price;
  bool operator ==(other) {
    if (identical(this, other)) return true;
    if (other is! Car) return false;

    return true &&
        this.name == other.name &&
        this.manufacturer == other.manufacturer &&
        this.price == other.price;
  }

  int get hashCode {
    return mapPropsToHashCode([name, manufacturer, price]);
  }

  String toString() {
    return 'Car <\'name\': ${this.name},\'manufacturer\': ${this.manufacturer},\'price\': ${this.price},>';
  }

  Car copyWith({String name, String manufacturer, double price}) {
    return Car(
      name: name ?? this.name,
      manufacturer: manufacturer ?? this.manufacturer,
      price: price ?? this.price,
    );
  }
}

3. Extend class with generated base class

@dataClass
class Car extends _$Car {
  final String name;
  final String manufacturer;
  final double price;

  Car({this.name, this.manufacturer, this.price});
}

Collection equality

@dataClass
class Car extends _$Car {
  @Collection(deepEquality: true) // Short-hand: @Collection()
  final List<String> parts;

  const Car({this.parts});
}

FAQ

  1. Why you didn't use extension methods?

As the docs says that:

It is a compile-time error if an extension:

  • Declares a member with the same basename as a member declared by Object (==, hashCode, toString, noSuchMethod, runtimeType). This applies to both static and instance member declarations.
  1. May I use generics?

Yes.