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#
Methods#
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#
Methods#
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#
Methods#
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