From 075968a2db5e7addfa0f776f64376bcde5f4fb4a Mon Sep 17 00:00:00 2001 From: TomRHandcock <33254448+TomRHandcock@users.noreply.github.com> Date: Mon, 6 Apr 2026 18:18:16 +0100 Subject: [PATCH 1/2] fix: Always generate keep alive insert in notifiers --- lib/src/code_builders/method_code_builder.dart | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/src/code_builders/method_code_builder.dart b/lib/src/code_builders/method_code_builder.dart index 429b5fc..1979e04 100644 --- a/lib/src/code_builders/method_code_builder.dart +++ b/lib/src/code_builders/method_code_builder.dart @@ -22,8 +22,6 @@ class MethodCodeBuilder { List generateMethods( ClassElement classElement, { bool seedValueProvided = true, - // TODO(TomRHandcock) Remove this field when deemed no longer required. - bool generateKeepAlive = false, }) { final methodElements = classElement.methods; final returnTypes = @@ -32,7 +30,7 @@ class MethodCodeBuilder { return methodElements .map((methodElement) => switch (methodElement.name) { "build" => generateBuildMethod( - methodElement, seedValueProvided, generateKeepAlive), + methodElement, seedValueProvided), _ => generateMethod(methodElement, fakedTypes), }) .whereType() @@ -42,7 +40,6 @@ class MethodCodeBuilder { Method generateBuildMethod( MethodElement method, bool seedValueProvided, - bool generateKeepAlive, ) { final isFuture = method.returnType.isDartAsyncFuture || method.returnType.isDartAsyncFutureOr; @@ -55,9 +52,7 @@ class MethodCodeBuilder { methodBuilder ..name = "build" ..body = Block((blockBuilder) { - if (generateKeepAlive) { - blockBuilder.addStaticCode(_keepAliveInsert); - } + blockBuilder.addStaticCode(_keepAliveInsert); if (isStream) { blockBuilder.addStaticCode("yield* "); } else { From ed405bbbcd45d71da9f497fbff463166721976ac Mon Sep 17 00:00:00 2001 From: TomRHandcock <33254448+TomRHandcock@users.noreply.github.com> Date: Mon, 6 Apr 2026 18:27:58 +0100 Subject: [PATCH 2/2] test: Update golden tests + unit tests --- .../async_notifier/expected.flumepod.dart | 2 ++ .../expected.flumepod.dart | 2 ++ .../expected.flumepod.dart | 2 ++ .../expected.flumepod.dart | 2 ++ .../expected.flumepod.dart | 2 ++ .../auto_dispose_notifier/expected.flumepod.dart | 2 ++ .../expected.flumepod.dart | 2 ++ .../family_async_notifier/expected.flumepod.dart | 2 ++ .../family_notifier/expected.flumepod.dart | 2 ++ .../expected.flumepod.dart | 2 ++ .../flumepod/notifier/expected.flumepod.dart | 2 ++ .../stream_notifier/expected.flumepod.dart | 2 ++ .../method_code_builder_test.dart | 16 ++++++++-------- 13 files changed, 32 insertions(+), 8 deletions(-) diff --git a/test/golden/flumepod/async_notifier/expected.flumepod.dart b/test/golden/flumepod/async_notifier/expected.flumepod.dart index fc8bd2b..b51e179 100644 --- a/test/golden/flumepod/async_notifier/expected.flumepod.dart +++ b/test/golden/flumepod/async_notifier/expected.flumepod.dart @@ -33,6 +33,8 @@ class MockTestNotifier extends _i1.$AsyncNotifier @override _i4.FutureOr build() async { + // keepAlive() used so mock instance with stubbed/real calls isn't disposed. + ref.keepAlive(); return noSuchMethod(Invocation.method(#build, []), returnValueForMissingStub: seedBuilder()); } diff --git a/test/golden/flumepod/auto_dispose_async_notifier/expected.flumepod.dart b/test/golden/flumepod/auto_dispose_async_notifier/expected.flumepod.dart index fc8bd2b..b51e179 100644 --- a/test/golden/flumepod/auto_dispose_async_notifier/expected.flumepod.dart +++ b/test/golden/flumepod/auto_dispose_async_notifier/expected.flumepod.dart @@ -33,6 +33,8 @@ class MockTestNotifier extends _i1.$AsyncNotifier @override _i4.FutureOr build() async { + // keepAlive() used so mock instance with stubbed/real calls isn't disposed. + ref.keepAlive(); return noSuchMethod(Invocation.method(#build, []), returnValueForMissingStub: seedBuilder()); } diff --git a/test/golden/flumepod/auto_dispose_family_async_notifier/expected.flumepod.dart b/test/golden/flumepod/auto_dispose_family_async_notifier/expected.flumepod.dart index 779c53d..e93b7ae 100644 --- a/test/golden/flumepod/auto_dispose_family_async_notifier/expected.flumepod.dart +++ b/test/golden/flumepod/auto_dispose_family_async_notifier/expected.flumepod.dart @@ -38,6 +38,8 @@ class MockTestNotifier extends _i1.$AsyncNotifier @override _i5.FutureOr build(String? param) async { + // keepAlive() used so mock instance with stubbed/real calls isn't disposed. + ref.keepAlive(); return noSuchMethod(Invocation.method(#build, [param]), returnValueForMissingStub: seedBuilder()); } diff --git a/test/golden/flumepod/auto_dispose_family_notifier/expected.flumepod.dart b/test/golden/flumepod/auto_dispose_family_notifier/expected.flumepod.dart index 1f286de..0d26ff0 100644 --- a/test/golden/flumepod/auto_dispose_family_notifier/expected.flumepod.dart +++ b/test/golden/flumepod/auto_dispose_family_notifier/expected.flumepod.dart @@ -35,6 +35,8 @@ class MockTestNotifier extends _i1.$Notifier @override String build(String? param) { + // keepAlive() used so mock instance with stubbed/real calls isn't disposed. + ref.keepAlive(); return noSuchMethod(Invocation.method(#build, [param]), returnValueForMissingStub: seedBuilder()); } diff --git a/test/golden/flumepod/auto_dispose_family_stream_notifier/expected.flumepod.dart b/test/golden/flumepod/auto_dispose_family_stream_notifier/expected.flumepod.dart index 75cd3ad..25a5609 100644 --- a/test/golden/flumepod/auto_dispose_family_stream_notifier/expected.flumepod.dart +++ b/test/golden/flumepod/auto_dispose_family_stream_notifier/expected.flumepod.dart @@ -38,6 +38,8 @@ class MockTestNotifier extends _i1.$StreamNotifier @override _i5.Stream build(String? param) async* { + // keepAlive() used so mock instance with stubbed/real calls isn't disposed. + ref.keepAlive(); yield* noSuchMethod(Invocation.method(#build, [param]), returnValueForMissingStub: seedBuilder()); } diff --git a/test/golden/flumepod/auto_dispose_notifier/expected.flumepod.dart b/test/golden/flumepod/auto_dispose_notifier/expected.flumepod.dart index 5752cd1..feee9ea 100644 --- a/test/golden/flumepod/auto_dispose_notifier/expected.flumepod.dart +++ b/test/golden/flumepod/auto_dispose_notifier/expected.flumepod.dart @@ -30,6 +30,8 @@ class MockTestNotifier extends _i1.$Notifier @override String build() { + // keepAlive() used so mock instance with stubbed/real calls isn't disposed. + ref.keepAlive(); return noSuchMethod(Invocation.method(#build, []), returnValueForMissingStub: seedBuilder()); } diff --git a/test/golden/flumepod/auto_dispose_stream_notifier/expected.flumepod.dart b/test/golden/flumepod/auto_dispose_stream_notifier/expected.flumepod.dart index 3fcf230..eba2626 100644 --- a/test/golden/flumepod/auto_dispose_stream_notifier/expected.flumepod.dart +++ b/test/golden/flumepod/auto_dispose_stream_notifier/expected.flumepod.dart @@ -33,6 +33,8 @@ class MockTestNotifier extends _i1.$StreamNotifier @override _i4.Stream build() async* { + // keepAlive() used so mock instance with stubbed/real calls isn't disposed. + ref.keepAlive(); yield* noSuchMethod(Invocation.method(#build, []), returnValueForMissingStub: seedBuilder()); } diff --git a/test/golden/flumepod/family_async_notifier/expected.flumepod.dart b/test/golden/flumepod/family_async_notifier/expected.flumepod.dart index 779c53d..e93b7ae 100644 --- a/test/golden/flumepod/family_async_notifier/expected.flumepod.dart +++ b/test/golden/flumepod/family_async_notifier/expected.flumepod.dart @@ -38,6 +38,8 @@ class MockTestNotifier extends _i1.$AsyncNotifier @override _i5.FutureOr build(String? param) async { + // keepAlive() used so mock instance with stubbed/real calls isn't disposed. + ref.keepAlive(); return noSuchMethod(Invocation.method(#build, [param]), returnValueForMissingStub: seedBuilder()); } diff --git a/test/golden/flumepod/family_notifier/expected.flumepod.dart b/test/golden/flumepod/family_notifier/expected.flumepod.dart index 9246379..84f1470 100644 --- a/test/golden/flumepod/family_notifier/expected.flumepod.dart +++ b/test/golden/flumepod/family_notifier/expected.flumepod.dart @@ -37,6 +37,8 @@ class MockTestNotifier extends _i1.$Notifier @override String build(_i7.Model? param) { + // keepAlive() used so mock instance with stubbed/real calls isn't disposed. + ref.keepAlive(); return noSuchMethod(Invocation.method(#build, [param]), returnValueForMissingStub: seedBuilder()); } diff --git a/test/golden/flumepod/family_stream_notifier/expected.flumepod.dart b/test/golden/flumepod/family_stream_notifier/expected.flumepod.dart index 75cd3ad..25a5609 100644 --- a/test/golden/flumepod/family_stream_notifier/expected.flumepod.dart +++ b/test/golden/flumepod/family_stream_notifier/expected.flumepod.dart @@ -38,6 +38,8 @@ class MockTestNotifier extends _i1.$StreamNotifier @override _i5.Stream build(String? param) async* { + // keepAlive() used so mock instance with stubbed/real calls isn't disposed. + ref.keepAlive(); yield* noSuchMethod(Invocation.method(#build, [param]), returnValueForMissingStub: seedBuilder()); } diff --git a/test/golden/flumepod/notifier/expected.flumepod.dart b/test/golden/flumepod/notifier/expected.flumepod.dart index 5752cd1..feee9ea 100644 --- a/test/golden/flumepod/notifier/expected.flumepod.dart +++ b/test/golden/flumepod/notifier/expected.flumepod.dart @@ -30,6 +30,8 @@ class MockTestNotifier extends _i1.$Notifier @override String build() { + // keepAlive() used so mock instance with stubbed/real calls isn't disposed. + ref.keepAlive(); return noSuchMethod(Invocation.method(#build, []), returnValueForMissingStub: seedBuilder()); } diff --git a/test/golden/flumepod/stream_notifier/expected.flumepod.dart b/test/golden/flumepod/stream_notifier/expected.flumepod.dart index 3fcf230..eba2626 100644 --- a/test/golden/flumepod/stream_notifier/expected.flumepod.dart +++ b/test/golden/flumepod/stream_notifier/expected.flumepod.dart @@ -33,6 +33,8 @@ class MockTestNotifier extends _i1.$StreamNotifier @override _i4.Stream build() async* { + // keepAlive() used so mock instance with stubbed/real calls isn't disposed. + ref.keepAlive(); yield* noSuchMethod(Invocation.method(#build, []), returnValueForMissingStub: seedBuilder()); } diff --git a/test/unit/code_builders/method_code_builder/method_code_builder_test.dart b/test/unit/code_builders/method_code_builder/method_code_builder_test.dart index 6e59015..9394898 100644 --- a/test/unit/code_builders/method_code_builder/method_code_builder_test.dart +++ b/test/unit/code_builders/method_code_builder/method_code_builder_test.dart @@ -30,7 +30,7 @@ void main() { }); test( - "generateBuildMethod - async, no seed, no keep alive - returns expected method", + "generateBuildMethod - async, no seed - returns expected method", () { // Setup final parameterTypeFixture = MockDartType(); @@ -55,7 +55,7 @@ void main() { // Run test final result = - sut.generateBuildMethod(methodElementFixture, false, false); + sut.generateBuildMethod(methodElementFixture, false); // Verify expect( @@ -102,7 +102,7 @@ void main() { }); test( - "generateBuildMethod - async, seeded, keep alive - returns expected method", + "generateBuildMethod - async, seeded - returns expected method", () { // Setup final parameterTypeFixture = MockDartType(); @@ -126,7 +126,7 @@ void main() { .thenReturn(const Reference("Future")); // Run test - final result = sut.generateBuildMethod(methodElementFixture, true, true); + final result = sut.generateBuildMethod(methodElementFixture, true); // Verify expect( @@ -183,7 +183,7 @@ void main() { }); test( - "generateBuildMethod - sync, no seed, no keep alive - returns expected method", + "generateBuildMethod - sync, no seed - returns expected method", () { // Setup final returnTypeFixture = MockDartType(); @@ -195,7 +195,7 @@ void main() { // Run test final result = - sut.generateBuildMethod(methodElementFixture, false, false); + sut.generateBuildMethod(methodElementFixture, false); // Verify expect( @@ -225,7 +225,7 @@ void main() { }); test( - "generateBuildMethod - stream, no seed, no keep alive - returns expected method", + "generateBuildMethod - stream, no seed - returns expected method", () { // Setup final returnTypeFixture = MockDartType(); @@ -238,7 +238,7 @@ void main() { // Run test final result = - sut.generateBuildMethod(methodElementFixture, false, false); + sut.generateBuildMethod(methodElementFixture, false); // Verify expect(