A correctness pass over the async-gating, deep-link, and page-memo edges. Still zero dependencies.
AsyncRedirect.invalidate()now cancels in-flight checks. A check already awaiting (auth/session lookup) could complete and apply a decision made from the very stateinvalidate()declared stale. Each check is now pinned to a cache generation; one that resolves after aninvalidate()is dropped (not cached, not applied) and any held navigation released, so the next navigation re-checks against fresh state.- A deep-link source that errors no longer surfaces as an unhandled async error. Errors from
initialLink/linkStreamthemselves are now caught and dropped — the app stays put and the stream keeps delivering later links — consistent with the existing "bad links don't crash" behavior. - Changing the
decoratorslist now invalidates the memoized pages. With a stable builder, existing pages kept their old decorated subtree; the decorator list now participates in memo invalidation (compared element-wise, so stable decorators keep the memo). - Raised the Flutter lower bound to
>=3.24.0to match the API surface actually used (Navigator.onDidRemovePage,PopScope.onPopInvokedWithResult).
Fixes #1.