LogoSignals.dart
Copy Markdown
rodydavis/signals.dart 999999

SignalEquality

Defines the equality check algorithm used by signals to determine if a new value.

Defines the equality check algorithm used by signals to determine if a new value actually differs from the current value.

By default, signals use standard Dart operator equality (==). However, you can configure a signal to use different strategies, such as deep equality check for collections or custom comparator checks.

Strategies:

  • standard: Default value equality (a == b).
  • identity: Identity-based comparison (identical(a, b)).
  • deep: Deep collection comparison for Lists, Maps, and Sets.
  • custom: User-defined boolean comparison function.

Example Usage#

import 'package:preact_signals/preact_signals.dart';

void main() {
  // Create a list signal using deep equality check
  final items = signal(
    [1, 2, 3],
    options: SignalOptions(
      equality: SignalEquality.deep(),
    ),
  );

  effect(() {
    print('Items changed: ${items.value}');
  });

  // Reassigning an identical value structure does NOT trigger a rebuild!
  items.value = [1, 2, 3];

  // Triggers rebuild
  items.value = [1, 2, 3, 4];
}

Constructors#

View Constructors
SignalEquality()

@nodoc

SignalEquality.custom(bool Function(T a, T b) fn)

Custom equality check

Uses a user-provided boolean function fn to check for equality.

Methods#

View Methods
bool equals(Object? a, Object? b)

Check if two values are equal

static SignalEquality<T> standard()

Standard equality check (a == b)

Matches two objects if their standard == operator returns true. This is the default strategy used by all signals.

static SignalEquality<T> identity()

Identity equality check (identical(a, b))

Matches two objects only if they are the exact same instance in memory.

static SignalEquality<T> deep()

Deep equality check

Matches collections (Lists, Maps, Sets) recursively by comparing their items.


SignalIdentityEquality#

Identity equality check (identical(a, b))

Matches two objects only if they point to the exact same instance in memory.

Example Usage#

final listA = [1, 2];
final listB = [1, 2];
final equality = SignalEquality.identity<List<int>>();
print(equality.equals(listA, listB)); // false
print(equality.equals(listA, listA)); // true

Constructors#

View Constructors
SignalIdentityEquality()

Creates a new SignalIdentityEquality instance.

Methods#

View Methods
bool equals(Object? a, Object? b)

SignalDeepEquality#

Deep equality check for collections

Recursively compares Lists, Maps, and Sets to see if their nested elements are equal.

Example Usage#

final equality = SignalEquality.deep();
print(equality.equals([1, [2, 3]], [1, [2, 3]])); // true

Constructors#

View Constructors
SignalDeepEquality()

Creates a new SignalDeepEquality instance.

Methods#

View Methods
bool equals(Object? a, Object? b)

SignalCustomEquality#

Custom equality check using a custom function

Uses a custom comparison function to determine if two values of type T are equal.

Example Usage#

final equality = SignalEquality.custom((User a, User b) => a.id == b.id);

Constructors#

View Constructors
SignalCustomEquality(this._fn)

Creates a new SignalCustomEquality instance.

Methods#

View Methods
bool equals(Object? a, Object? b)

SignalStandardEquality#

Standard equality check (a == b)

Matches two objects using the standard Dart operator ==.

Example Usage#

final equality = SignalEquality.standard<int>();
print(equality.equals(5, 5)); // true

Constructors#

View Constructors
SignalStandardEquality()

Creates a new SignalStandardEquality instance.

Methods#

View Methods
bool equals(Object? a, Object? b)