Skip to content

fix: make derived notifiers detach on last listener removals - #2

Open
Feichtmeier wants to merge 2 commits into
flutter-it:mainfrom
Feichtmeier:fix/derived_notifier_detach
Open

fix: make derived notifiers detach on last listener removals#2
Feichtmeier wants to merge 2 commits into
flutter-it:mainfrom
Feichtmeier:fix/derived_notifier_detach

Conversation

@Feichtmeier

Copy link
Copy Markdown
  • Behavior change (fixes a listener leak): derived notifiers created by the operators (select, map, where, debounce, async, combineLatest*, mergeWith) now detach from their source when their last listener is removed, symmetric to how they attach on the first listener. Previously a chain stayed subscribed to its source forever (until dispose()), which leaked a listener on the source every time an operator chain was created inline and discarded (e.g. inside a build() / watchValue).
    • On re-observation a chain resyncs its value from the current source value, so resubscription remains correct and never stale.
    • The only observable difference: while a chain has zero listeners it no longer tracks its source (its .value is refreshed on the next observation instead of continuously). Chains that always have at least one listener are unaffected.

- Behavior change (fixes a listener leak): derived notifiers created by the
operators (`select`, `map`, `where`, `debounce`, `async`, `combineLatest*`,
  `mergeWith`) now **detach from their source when their last listener is
  removed**, symmetric to how they attach on the first listener. Previously a
  chain stayed subscribed to its source forever (until `dispose()`), which
  leaked a listener on the source every time an operator chain was created
  inline and discarded (e.g. inside a `build()` / `watchValue`).
  - On re-observation a chain **resyncs** its value from the current source
    value, so resubscription remains correct and never stale.
  - The only observable difference: while a chain has **zero** listeners it no
    longer tracks its source (its `.value` is refreshed on the next
    observation instead of continuously). Chains that always have at least one
    listener are unaffected.
@codecov

codecov Bot commented Jul 14, 2026

Copy link
Copy Markdown

Welcome to Codecov 🎉

Once you merge this PR into your default branch, you're all set! Codecov will compare coverage reports and display results in all future pull requests.

ℹ️ You can also turn on project coverage checks and project coverage reporting on Pull Request comment

Thanks for integrating Codecov - We've got you covered ☂️

@Feichtmeier
Feichtmeier force-pushed the fix/derived_notifier_detach branch from b4864d7 to 9232d68 Compare July 27, 2026 11:13
@Feichtmeier
Feichtmeier force-pushed the fix/derived_notifier_detach branch from 9232d68 to b2a5490 Compare July 27, 2026 11:34
@Feichtmeier
Feichtmeier marked this pull request as ready for review July 27, 2026 12:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant