From b8bde8b0c02baa2d335cb7ce94d9a8e6f36e7832 Mon Sep 17 00:00:00 2001 From: jeiea Date: Mon, 24 Apr 2023 19:29:20 +0900 Subject: [PATCH] fix: not disposing autoDispose family provider (#2481) fixes #2480 --- .github/workflows/build.yml | 4 +++- .../auto_dispose.dart | 3 +-- packages/riverpod/CHANGELOG.md | 1 + .../riverpod/lib/src/async_notifier/base.dart | 3 +-- .../riverpod/lib/src/framework/container.dart | 3 +-- .../riverpod/lib/src/framework/family.dart | 6 +++--- .../state_notifier_provider/auto_dispose.dart | 3 +-- .../test/framework/auto_dispose_test.dart | 20 +++++++++++++++++++ 8 files changed, 31 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d938398b0..a1d9f4b05 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,6 +25,7 @@ jobs: matrix: channel: - stable + - master package_path: - examples/counter - examples/marvel @@ -70,10 +71,11 @@ jobs: - name: Check format run: dart format --set-exit-if-changed . - if: matrix.package_path != 'website' + if: matrix.package_path != 'website' && matrix.channel == 'master' - name: Analyze run: flutter analyze + if: matrix.channel == 'master' - name: Run tests run: | diff --git a/packages/flutter_riverpod/lib/src/change_notifier_provider/auto_dispose.dart b/packages/flutter_riverpod/lib/src/change_notifier_provider/auto_dispose.dart index 6cc82ad3b..4987332fb 100644 --- a/packages/flutter_riverpod/lib/src/change_notifier_provider/auto_dispose.dart +++ b/packages/flutter_riverpod/lib/src/change_notifier_provider/auto_dispose.dart @@ -114,8 +114,7 @@ class AutoDisposeChangeNotifierProviderFamily ref, Arg arg, - ) - create, + ) create, ) { return FamilyOverrideImpl>( diff --git a/packages/riverpod/CHANGELOG.md b/packages/riverpod/CHANGELOG.md index 9a319d7c1..52cd80140 100644 --- a/packages/riverpod/CHANGELOG.md +++ b/packages/riverpod/CHANGELOG.md @@ -2,6 +2,7 @@ - Improved error message for missing `dependencies` (thanks to @ValentinVignal) - Fixed various typos in the documentation (thanks to @ValentinVignal) +- Fix not disposing autoDispose family providers ## 2.3.5 - 2023-04-18 diff --git a/packages/riverpod/lib/src/async_notifier/base.dart b/packages/riverpod/lib/src/async_notifier/base.dart index f6f58b35d..1109143b4 100644 --- a/packages/riverpod/lib/src/async_notifier/base.dart +++ b/packages/riverpod/lib/src/async_notifier/base.dart @@ -361,8 +361,7 @@ mixin FutureHandlerProviderElementMixin required void Function(Object, StackTrace) error, required void Function() done, required void Function(Future, CancelAsyncSubscription) last, - }) - listen, { + }) listen, { required bool didChangeDependency, }) { _onLoading(AsyncLoading(), seamless: !didChangeDependency); diff --git a/packages/riverpod/lib/src/framework/container.dart b/packages/riverpod/lib/src/framework/container.dart index bb5055d7d..5e674d72d 100644 --- a/packages/riverpod/lib/src/framework/container.dart +++ b/packages/riverpod/lib/src/framework/container.dart @@ -327,8 +327,7 @@ class ProviderContainer implements Node { // on provider dispose, to avoid memory leak void removeStateReaderFrom(ProviderContainer container) { - final reader = container._stateReaders[element._origin]; - if (reader?.override == provider) { + if (container._stateReaders[element._origin] == reader) { container._stateReaders.remove(element._origin); } container._children.forEach(removeStateReaderFrom); diff --git a/packages/riverpod/lib/src/framework/family.dart b/packages/riverpod/lib/src/framework/family.dart index cd75abc38..bf348427f 100644 --- a/packages/riverpod/lib/src/framework/family.dart +++ b/packages/riverpod/lib/src/framework/family.dart @@ -33,9 +33,9 @@ typedef FamilyCreate = T Function(R ref, Arg arg); /// A base class for all families abstract class Family< @Deprecated( - 'The generic parameter will be removed in version 3.0.0. ' - 'This is to enable riverpod_generator to implement families with generic parameters', -) + 'The generic parameter will be removed in version 3.0.0. ' + 'This is to enable riverpod_generator to implement families with generic parameters', + ) // ignore: deprecated_member_use_from_same_package State> implements FamilyOverride, ProviderOrFamily { /// A base class for all families diff --git a/packages/riverpod/lib/src/state_notifier_provider/auto_dispose.dart b/packages/riverpod/lib/src/state_notifier_provider/auto_dispose.dart index b69659da4..6a08081f0 100644 --- a/packages/riverpod/lib/src/state_notifier_provider/auto_dispose.dart +++ b/packages/riverpod/lib/src/state_notifier_provider/auto_dispose.dart @@ -111,8 +111,7 @@ class AutoDisposeStateNotifierProviderFamily, NotifierT Function( AutoDisposeStateNotifierProviderRef ref, Arg arg, - ) - create, + ) create, ) { return FamilyOverrideImpl>( diff --git a/packages/riverpod/test/framework/auto_dispose_test.dart b/packages/riverpod/test/framework/auto_dispose_test.dart index b51635922..7de599a3d 100644 --- a/packages/riverpod/test/framework/auto_dispose_test.dart +++ b/packages/riverpod/test/framework/auto_dispose_test.dart @@ -529,6 +529,26 @@ final alwaysAlive = Provider((ref) { expect(container.getAllProviderElements(), isEmpty); }); + test('supports disposing of overridden families', () async { + // Regression test for https://github.com/rrousselGit/riverpod/issues/2480 + final provider = Provider.autoDispose.family((ref, _) => -1); + + var constructionCount = 0; + final root = createContainer(); + final container = createContainer( + parent: root, + overrides: [provider.overrideWith((ref, arg) => ++constructionCount)], + ); + + var count = container.read(provider(0)); + expect(count, 1); + + await container.pump(); + + count = container.read(provider(0)); + expect(count, 2); + }); + test( 'can select auto-dispose providers if the selecting provider is auto-dispose too', () {