unsaved_changes library

Detects unsaved changes on editable Flutter surfaces by diffing live state against a captured baseline, and reports what changed.

Classes

BaselineSource<T extends Object>
Where a tracker learns that the saved state it should compare against has been replaced — typically the provider or bloc holding the server's copy.
ChangeDetector<C, K extends Object>
Captures a baseline from C and reports how the live state differs.
ChangeSet<K extends Object>
An immutable read-model over the changes a tracker currently reports.
ChangeTracker<C, K extends Object>
Reports whether an editable surface still matches the state it was loaded with, and what differs.
ChangeTrackerObserver
Observes a tracker's lifecycle — for logging, breadcrumbs, or tests.
CollectionDetector<C, K extends Object, T>
Reports items added to, removed from, or edited inside a keyed collection.
DetectorSession<C, K extends Object>
A baseline captured by a ChangeDetector, able to diff against itself.
Facet<T, K extends Object>
One comparable aspect of a value, and the change kind it reports.
FieldGroup<C, K extends Object>
A set of fields that report one change kind between them.
FieldGroupDetector<C, K extends Object>
Reports a change per FieldGroup whose fields no longer match the baseline.
ItemSnapshot
What a keyed collection captured for one item.
MembershipDetector<C, K extends Object>
Reports keys entering or leaving a set — "which items has the user staged a resolution for", "which rows are selected".
PayloadDigest
The baseline for a PayloadDigestDetector: a canonical payload string, or a marker saying the payload cannot be diffed.
PayloadDigestDetector<C, K extends Object>
A safety net: digests the whole request payload and reports a change when it moves at all.
SnapshotChangeDetector<S, C, K extends Object>
A ChangeDetector that captures a value of type S and compares against it — the shape almost every detector wants.
StreamSignal
Adapts a Stream to a Listenable, so stream-based state (a bloc) can drive anything that expects a listenable.
TrackedChange<K extends Object>
A single difference between the captured baseline and the live state.
TrackerOptions
Tuning for a tracker.
ValueStreamDetector<C, S, K extends Object>
Compares facets of a single value read from C — a bloc state, a view model, a controller — and subscribes to the stream that publishes it.

Enums

CommonChangeKind
A ready-made change-kind enum for surfaces that do not need a bespoke one.
DetectorRole
How a tracker treats the changes a detector reports.
MembershipDelta
Which side of a membership change to report.

Functions

defaultEquals(Object? a, Object? b) → bool
Compares two captured values, descending into lists, maps, and sets.
nullableStringEquals(Object? a, Object? b) → bool
Treats null and the empty string as the same value.
streamBaseline<T extends Object>({required T? read(), required Stream<Object?> stream, Object? revisionOf(T value)?}) → BaselineSource<T>
Builds a BaselineSource from stream-based state — a bloc, a ValueStream, anything that republishes the saved copy.