dataclass_beta 1.0.1 copy "dataclass_beta: ^1.0.1" to clipboard
dataclass_beta: ^1.0.1 copied to clipboard

DataClass annotation for dataclass_generator. Used for generating base class with equals, hashCode, toString, copyWith methods.

dataclass #

License Pub.dev Github Stars

@DataClass annotation used for dataclass_generator

The DataClass generator generates mixin 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({
    required this.name, 
    this.manufacturer, 
    required this.price
  });
}

2. Generate dataclass base class #

Run pub run build_runner build

Generated file

mixin _$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 with _$Car {
  final String name;
  final String? manufacturer;
  final double price;

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

Collection equality


@DataClass()
class Car with _$Car {

  final List<String> parts;

  const Car({
    @Collection(deepEquality: true) // Short-hand: @Collection()
    required 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.

1
likes
140
pub points
26%
popularity

Publisher

unverified uploader

DataClass annotation for dataclass_generator. Used for generating base class with equals, hashCode, toString, copyWith methods.

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

collection

More

Packages that depend on dataclass_beta