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 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 identity()

Identity equality check (identical(a, b))

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

static SignalEquality 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)