Skip to content

mrgnhnt96/autoequal

Folders and files

NameName
Last commit message
Last commit date

Latest commit

18e63a1 · Feb 22, 2025
Jan 11, 2024
Jan 11, 2024
Jan 17, 2024
Feb 22, 2025
Feb 22, 2025
Feb 22, 2025
Jan 11, 2024
Oct 29, 2020
Jan 11, 2024
Feb 22, 2025

Repository files navigation

Pub Package

Provides Dart Build System builder for generating List<Object?> _$props private extensions for classes annotated with autoequal.

Usage

In your pubspec.yaml file

  • Add autoequal to your dependencies
  • Add autoequal_gen to your dev_dependencies
  • Add build_runner to your dev_dependencies

Annotate your class with @autoequal annotation

import 'package:autoequal/autoequal.dart';
import 'package:equatable/equatable.dart';

part 'some_class.g.dart';

@autoequal
class SomeClass extends Equatable {
  const SomeClass({this.id, this.random});

  final String id;

  @override
  List<Object?> get props => _$props; //_$props will be generated
}

Make sure that you set the part file as in the example above part 'your_file_name.g.dart';.

Launch code generation

flutter pub run build_runner build

The extension will be generated

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'some_class.dart';

// **************************************************************************
// AutoequalGenerator
// **************************************************************************

extension _$SomeClassAutoequal on SomeClass {
  List<Object> get _$props => [id];
}

Auto Include with Annotating

The @autoequal is smart enough to generate the props getter for classes that use Equatable without having to annotate the class with @autoequal.

To do this, update your build.yaml file to:

Include the auto_include: true option

targets:
  $default:
    builders:
      autoequal_gen:
        enabled: true
        options:
          auto_include: true
          exclude:
            - SomeClass # regex pattern (for class names)

Or, add a regex pattern to the include option

targets:
  $default:
    builders:
      autoequal_gen:
        enabled: true
        options:
          include:
            - SomeClass # regex pattern (for class names)

Then, use equatable and create the props getter as you normally would.

class SomeClass with EquatableMixin { // or `extends Equatable`
  const SomeClass({this.id});

  final String id;

  @override
  List<Object?> get props => _$props;
}

NOTE: If the props getter is not defined, the autoequal will not generate the _$props variable.

Inheritance

If your class extends another class that uses Equatable, you can use the @autoequal annotation and autoequal will do the rest!

@autoequal
class SubClass extends BaseClass { // BaseClass extends Equatable
  const SubClass({required this.name, required super.id});

  final String name;


  @override
  List<Object?> get props => _$props;
}

// generated code
extension _$SubClassAutoequal on SubClass {
  List<Object?> get _$props => [name, id];
}

Field/Getter annotations

Ignore

You can include fields or getter methods in props by annotating them with @ignore.

@ignore
final int random;

Include

You can include fields or getter methods in props by annotating them with @include.

@include
String get id => _id;

Build.yaml options

By default, the builder will ignore all getter methods in props, but you can change this behavior by adding the following to your build.yaml file:

targets:
  $default:
    builders:

      autoequal_gen:
        enabled: true
        options:
          ... # view options below

Options

To view a comprehensive list of options, view the source code

All options are optional. All option's keys are formatted in snake_case.