[go_router] Use leak_tracker_flutter_testing (#6210)

This commit is contained in:
Valentin Vignal
2024-03-15 21:56:45 +08:00
committed by GitHub
parent 6db47f400a
commit 756dcc1118
17 changed files with 85 additions and 9 deletions

View File

@ -1,6 +1,7 @@
## NEXT ## 13.2.1
* Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. - Updates minimum supported SDK version to Flutter 3.16/Dart 3.2.
- Fixes memory leaks.
## 13.2.0 ## 13.2.0

View File

@ -4,8 +4,8 @@ version: 3.0.1
publish_to: none publish_to: none
environment: environment:
sdk: ^3.1.0 sdk: ^3.2.0
flutter: ">=3.13.0" flutter: ">=3.16.0"
dependencies: dependencies:
adaptive_navigation: ^0.0.4 adaptive_navigation: ^0.0.4

View File

@ -189,6 +189,13 @@ class _CustomNavigatorState extends State<_CustomNavigator> {
_pages = null; _pages = null;
} }
@override
void dispose() {
_controller?.dispose();
_registry.dispose();
super.dispose();
}
void _updatePages(BuildContext context) { void _updatePages(BuildContext context) {
assert(_pages == null); assert(_pages == null);
final List<Page<Object?>> pages = <Page<Object?>>[]; final List<Page<Object?>> pages = <Page<Object?>>[];

View File

@ -1,13 +1,13 @@
name: go_router name: go_router
description: A declarative router for Flutter based on Navigation 2 supporting description: A declarative router for Flutter based on Navigation 2 supporting
deep linking, data-driven routes and more deep linking, data-driven routes and more
version: 13.2.0 version: 13.2.1
repository: https://github.com/flutter/packages/tree/main/packages/go_router repository: https://github.com/flutter/packages/tree/main/packages/go_router
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+go_router%22 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+go_router%22
environment: environment:
sdk: ">=3.1.0 <4.0.0" sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.13.0" flutter: ">=3.16.0"
dependencies: dependencies:
collection: ^1.15.0 collection: ^1.15.0

View File

@ -371,6 +371,7 @@ void main() {
), ),
], ],
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget(MaterialApp.router( await tester.pumpWidget(MaterialApp.router(
routerConfig: goRouter, routerConfig: goRouter,

View File

@ -22,6 +22,7 @@ void main() {
), ),
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routerConfig: router, routerConfig: router,
@ -35,6 +36,7 @@ void main() {
(WidgetTester tester) async { (WidgetTester tester) async {
final ValueNotifier<bool> showHomeValueNotifier = final ValueNotifier<bool> showHomeValueNotifier =
ValueNotifier<bool>(false); ValueNotifier<bool>(false);
addTearDown(showHomeValueNotifier.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
home: ValueListenableBuilder<bool>( home: ValueListenableBuilder<bool>(
@ -83,6 +85,7 @@ void main() {
testWidgets('NoTransitionPage does not apply any reverse transition', testWidgets('NoTransitionPage does not apply any reverse transition',
(WidgetTester tester) async { (WidgetTester tester) async {
final ValueNotifier<bool> showHomeValueNotifier = ValueNotifier<bool>(true); final ValueNotifier<bool> showHomeValueNotifier = ValueNotifier<bool>(true);
addTearDown(showHomeValueNotifier.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
home: ValueListenableBuilder<bool>( home: ValueListenableBuilder<bool>(
@ -139,6 +142,7 @@ void main() {
), ),
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget(MaterialApp.router(routerConfig: router)); await tester.pumpWidget(MaterialApp.router(routerConfig: router));
expect(find.byKey(homeKey), findsOneWidget); expect(find.byKey(homeKey), findsOneWidget);
router.push('/dismissible-modal'); router.push('/dismissible-modal');
@ -176,6 +180,7 @@ void main() {
), ),
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget(MaterialApp.router(routerConfig: router)); await tester.pumpWidget(MaterialApp.router(routerConfig: router));
expect(find.byKey(homeKey), findsOneWidget); expect(find.byKey(homeKey), findsOneWidget);

View File

@ -12,6 +12,7 @@ import 'test_helpers.dart';
Future<GoRouter> createGoRouter( Future<GoRouter> createGoRouter(
WidgetTester tester, { WidgetTester tester, {
Listenable? refreshListenable, Listenable? refreshListenable,
bool dispose = true,
}) async { }) async {
final GoRouter router = GoRouter( final GoRouter router = GoRouter(
initialLocation: '/', initialLocation: '/',
@ -25,6 +26,9 @@ Future<GoRouter> createGoRouter(
], ],
refreshListenable: refreshListenable, refreshListenable: refreshListenable,
); );
if (dispose) {
addTearDown(router.dispose);
}
await tester.pumpWidget(MaterialApp.router( await tester.pumpWidget(MaterialApp.router(
routerConfig: router, routerConfig: router,
)); ));
@ -65,6 +69,7 @@ Future<GoRouter> createGoRouterWithStatefulShellRoute(
], builder: mockStackedShellBuilder), ], builder: mockStackedShellBuilder),
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget(MaterialApp.router( await tester.pumpWidget(MaterialApp.router(
routerConfig: router, routerConfig: router,
)); ));
@ -287,6 +292,7 @@ void main() {
GoRoute(path: '/page-1', builder: (_, __) => const SizedBox()), GoRoute(path: '/page-1', builder: (_, __) => const SizedBox()),
], ],
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routerConfig: goRouter, routerConfig: goRouter,
@ -369,6 +375,7 @@ void main() {
builder: (_, __) => const SizedBox()), builder: (_, __) => const SizedBox()),
], ],
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routerConfig: goRouter, routerConfig: goRouter,
@ -418,6 +425,7 @@ void main() {
GoRoute(path: '/page-1', builder: (_, __) => const SizedBox()), GoRoute(path: '/page-1', builder: (_, __) => const SizedBox()),
], ],
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routerConfig: goRouter, routerConfig: goRouter,
@ -535,6 +543,7 @@ void main() {
), ),
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget(MaterialApp.router( await tester.pumpWidget(MaterialApp.router(
routerConfig: router, routerConfig: router,
)); ));
@ -634,8 +643,13 @@ void main() {
testWidgets('dispose unsubscribes from refreshListenable', testWidgets('dispose unsubscribes from refreshListenable',
(WidgetTester tester) async { (WidgetTester tester) async {
final FakeRefreshListenable refreshListenable = FakeRefreshListenable(); final FakeRefreshListenable refreshListenable = FakeRefreshListenable();
final GoRouter goRouter = addTearDown(refreshListenable.dispose);
await createGoRouter(tester, refreshListenable: refreshListenable);
final GoRouter goRouter = await createGoRouter(
tester,
refreshListenable: refreshListenable,
dispose: false,
);
await tester.pumpWidget(Container()); await tester.pumpWidget(Container());
goRouter.dispose(); goRouter.dispose();
expect(refreshListenable.unsubscribed, true); expect(refreshListenable.unsubscribed, true);

View File

@ -26,6 +26,7 @@ void main() {
builder: (_, __) => const SizedBox()) builder: (_, __) => const SizedBox())
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget(MaterialApp.router( await tester.pumpWidget(MaterialApp.router(
routerConfig: router, routerConfig: router,
)); ));

View File

@ -32,6 +32,8 @@ void main() {
return null; return null;
}, },
); );
addTearDown(router.dispose);
final SimpleDependency dependency = SimpleDependency(); final SimpleDependency dependency = SimpleDependency();
addTearDown(() => dependency.dispose()); addTearDown(() => dependency.dispose());

View File

@ -968,6 +968,8 @@ void main() {
testWidgets('does not crash when inherited widget changes', testWidgets('does not crash when inherited widget changes',
(WidgetTester tester) async { (WidgetTester tester) async {
final ValueNotifier<String> notifier = ValueNotifier<String>('initial'); final ValueNotifier<String> notifier = ValueNotifier<String>('initial');
addTearDown(notifier.dispose);
final List<GoRoute> routes = <GoRoute>[ final List<GoRoute> routes = <GoRoute>[
GoRoute( GoRoute(
path: '/', path: '/',
@ -985,6 +987,7 @@ void main() {
final GoRouter router = GoRouter( final GoRouter router = GoRouter(
routes: routes, routes: routes,
); );
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routerConfig: router, routerConfig: router,
@ -3212,6 +3215,7 @@ void main() {
(WidgetTester tester) async { (WidgetTester tester) async {
final GoRouterNamedLocationSpy router = final GoRouterNamedLocationSpy router =
GoRouterNamedLocationSpy(routes: routes); GoRouterNamedLocationSpy(routes: routes);
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routerConfig: router, routerConfig: router,
@ -3230,6 +3234,7 @@ void main() {
testWidgets('calls [go] on closest GoRouter', (WidgetTester tester) async { testWidgets('calls [go] on closest GoRouter', (WidgetTester tester) async {
final GoRouterGoSpy router = GoRouterGoSpy(routes: routes); final GoRouterGoSpy router = GoRouterGoSpy(routes: routes);
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routerConfig: router, routerConfig: router,
@ -3247,6 +3252,7 @@ void main() {
testWidgets('calls [goNamed] on closest GoRouter', testWidgets('calls [goNamed] on closest GoRouter',
(WidgetTester tester) async { (WidgetTester tester) async {
final GoRouterGoNamedSpy router = GoRouterGoNamedSpy(routes: routes); final GoRouterGoNamedSpy router = GoRouterGoNamedSpy(routes: routes);
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routerConfig: router, routerConfig: router,
@ -3268,6 +3274,7 @@ void main() {
testWidgets('calls [push] on closest GoRouter', testWidgets('calls [push] on closest GoRouter',
(WidgetTester tester) async { (WidgetTester tester) async {
final GoRouterPushSpy router = GoRouterPushSpy(routes: routes); final GoRouterPushSpy router = GoRouterPushSpy(routes: routes);
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routerConfig: router, routerConfig: router,
@ -3285,6 +3292,7 @@ void main() {
testWidgets('calls [push] on closest GoRouter and waits for result', testWidgets('calls [push] on closest GoRouter and waits for result',
(WidgetTester tester) async { (WidgetTester tester) async {
final GoRouterPushSpy router = GoRouterPushSpy(routes: routes); final GoRouterPushSpy router = GoRouterPushSpy(routes: routes);
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routeInformationProvider: router.routeInformationProvider, routeInformationProvider: router.routeInformationProvider,
@ -3305,6 +3313,7 @@ void main() {
testWidgets('calls [pushNamed] on closest GoRouter', testWidgets('calls [pushNamed] on closest GoRouter',
(WidgetTester tester) async { (WidgetTester tester) async {
final GoRouterPushNamedSpy router = GoRouterPushNamedSpy(routes: routes); final GoRouterPushNamedSpy router = GoRouterPushNamedSpy(routes: routes);
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routerConfig: router, routerConfig: router,
@ -3326,6 +3335,7 @@ void main() {
testWidgets('calls [pushNamed] on closest GoRouter and waits for result', testWidgets('calls [pushNamed] on closest GoRouter and waits for result',
(WidgetTester tester) async { (WidgetTester tester) async {
final GoRouterPushNamedSpy router = GoRouterPushNamedSpy(routes: routes); final GoRouterPushNamedSpy router = GoRouterPushNamedSpy(routes: routes);
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routeInformationProvider: router.routeInformationProvider, routeInformationProvider: router.routeInformationProvider,
@ -3349,6 +3359,7 @@ void main() {
testWidgets('calls [pop] on closest GoRouter', (WidgetTester tester) async { testWidgets('calls [pop] on closest GoRouter', (WidgetTester tester) async {
final GoRouterPopSpy router = GoRouterPopSpy(routes: routes); final GoRouterPopSpy router = GoRouterPopSpy(routes: routes);
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routerConfig: router, routerConfig: router,
@ -3363,6 +3374,7 @@ void main() {
testWidgets('calls [pop] on closest GoRouter with result', testWidgets('calls [pop] on closest GoRouter with result',
(WidgetTester tester) async { (WidgetTester tester) async {
final GoRouterPopSpy router = GoRouterPopSpy(routes: routes); final GoRouterPopSpy router = GoRouterPopSpy(routes: routes);
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
routerConfig: router, routerConfig: router,
@ -4315,6 +4327,7 @@ void main() {
GoRoute(path: '/a', builder: (_, __) => const DummyScreen()), GoRoute(path: '/a', builder: (_, __) => const DummyScreen()),
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
@ -4377,6 +4390,7 @@ void main() {
), ),
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
@ -4443,6 +4457,7 @@ void main() {
), ),
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
@ -4499,6 +4514,7 @@ void main() {
), ),
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget(MaterialApp.router(routerConfig: router)); await tester.pumpWidget(MaterialApp.router(routerConfig: router));
@ -4568,6 +4584,7 @@ void main() {
), ),
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
@ -4638,6 +4655,7 @@ void main() {
), ),
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget(MaterialApp.router(routerConfig: router)); await tester.pumpWidget(MaterialApp.router(routerConfig: router));

View File

@ -42,6 +42,7 @@ WidgetTesterCallback testClickingTheButtonRedirectsToRoot({
), ),
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget(appRouterBuilder(router)); await tester.pumpWidget(appRouterBuilder(router));
await tester.tap(buttonFinder); await tester.tap(buttonFinder);
await tester.pumpAndSettle(); await tester.pumpAndSettle();

View File

@ -97,6 +97,7 @@ void main() {
) )
], ],
); );
addTearDown(router.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(

View File

@ -25,6 +25,7 @@ void main() {
), ),
], ],
); );
addTearDown(router.dispose);
// run MaterialApp, initial screen path is '/' -> ScreenA // run MaterialApp, initial screen path is '/' -> ScreenA
await tester.pumpWidget( await tester.pumpWidget(

View File

@ -27,6 +27,7 @@ void main() {
redirectLimit: redirectLimit, redirectLimit: redirectLimit,
redirect: redirect, redirect: redirect,
); );
addTearDown(router.dispose);
await tester.pumpWidget(MaterialApp.router( await tester.pumpWidget(MaterialApp.router(
routerConfig: router, routerConfig: router,
)); ));

View File

@ -199,6 +199,7 @@ void main() {
initialLocation: '/build', initialLocation: '/build',
routes: _routes, routes: _routes,
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter)); await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter));
expect(find.byKey(const Key('build')), findsOneWidget); expect(find.byKey(const Key('build')), findsOneWidget);
expect(find.byKey(const Key('buildPage')), findsNothing); expect(find.byKey(const Key('buildPage')), findsNothing);
@ -212,6 +213,7 @@ void main() {
initialLocation: '/build-page', initialLocation: '/build-page',
routes: _routes, routes: _routes,
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter)); await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter));
expect(find.byKey(const Key('build')), findsNothing); expect(find.byKey(const Key('build')), findsNothing);
expect(find.byKey(const Key('buildPage')), findsOneWidget); expect(find.byKey(const Key('buildPage')), findsOneWidget);
@ -229,6 +231,7 @@ void main() {
_shellRouteDataBuilder, _shellRouteDataBuilder,
], ],
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter)); await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter));
expect(find.byKey(const Key('builder')), findsOneWidget); expect(find.byKey(const Key('builder')), findsOneWidget);
expect(find.byKey(const Key('page-builder')), findsNothing); expect(find.byKey(const Key('page-builder')), findsNothing);
@ -272,6 +275,7 @@ void main() {
), ),
], ],
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget(MaterialApp.router( await tester.pumpWidget(MaterialApp.router(
routerConfig: goRouter, routerConfig: goRouter,
)); ));
@ -301,6 +305,7 @@ void main() {
_shellRouteDataPageBuilder, _shellRouteDataPageBuilder,
], ],
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter)); await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter));
expect(find.byKey(const Key('builder')), findsNothing); expect(find.byKey(const Key('builder')), findsNothing);
expect(find.byKey(const Key('page-builder')), findsOneWidget); expect(find.byKey(const Key('page-builder')), findsOneWidget);
@ -318,6 +323,7 @@ void main() {
_statefulShellRouteDataBuilder, _statefulShellRouteDataBuilder,
], ],
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter)); await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter));
expect(find.byKey(const Key('builder')), findsOneWidget); expect(find.byKey(const Key('builder')), findsOneWidget);
expect(find.byKey(const Key('page-builder')), findsNothing); expect(find.byKey(const Key('page-builder')), findsNothing);
@ -333,6 +339,7 @@ void main() {
_statefulShellRouteDataPageBuilder, _statefulShellRouteDataPageBuilder,
], ],
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter)); await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter));
expect(find.byKey(const Key('builder')), findsNothing); expect(find.byKey(const Key('builder')), findsNothing);
expect(find.byKey(const Key('page-builder')), findsOneWidget); expect(find.byKey(const Key('page-builder')), findsOneWidget);
@ -367,6 +374,7 @@ void main() {
initialLocation: '/redirect', initialLocation: '/redirect',
routes: _routes, routes: _routes,
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter)); await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter));
expect(find.byKey(const Key('build')), findsNothing); expect(find.byKey(const Key('build')), findsNothing);
expect(find.byKey(const Key('buildPage')), findsOneWidget); expect(find.byKey(const Key('buildPage')), findsOneWidget);
@ -380,6 +388,7 @@ void main() {
initialLocation: '/redirect-with-state', initialLocation: '/redirect-with-state',
routes: _routes, routes: _routes,
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter)); await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter));
expect(find.byKey(const Key('build')), findsNothing); expect(find.byKey(const Key('build')), findsNothing);
expect(find.byKey(const Key('buildPage')), findsNothing); expect(find.byKey(const Key('buildPage')), findsNothing);

View File

@ -18,6 +18,7 @@ void main() {
redirect: (_, __) => '/', redirect: (_, __) => '/',
), ),
); );
addTearDown(config.dispose);
final GoRouter router = await createRouterWithRoutingConfig(config, tester); final GoRouter router = await createRouterWithRoutingConfig(config, tester);
expect(find.text('home'), findsOneWidget); expect(find.text('home'), findsOneWidget);
@ -35,6 +36,7 @@ void main() {
], ],
), ),
); );
addTearDown(config.dispose);
await createRouterWithRoutingConfig(config, tester); await createRouterWithRoutingConfig(config, tester);
expect(find.text('home'), findsOneWidget); expect(find.text('home'), findsOneWidget);
@ -56,6 +58,7 @@ void main() {
], ],
), ),
); );
addTearDown(config.dispose);
final GoRouter router = await createRouterWithRoutingConfig( final GoRouter router = await createRouterWithRoutingConfig(
config, config,
tester, tester,
@ -87,6 +90,7 @@ void main() {
], ],
), ),
); );
addTearDown(config.dispose);
final GoRouter router = await createRouterWithRoutingConfig( final GoRouter router = await createRouterWithRoutingConfig(
config, config,
tester, tester,
@ -120,11 +124,13 @@ void main() {
], ],
), ),
); );
addTearDown(config.dispose);
final GoRouter router = await createRouterWithRoutingConfig( final GoRouter router = await createRouterWithRoutingConfig(
config, config,
tester, tester,
errorBuilder: (_, __) => const Text('error'), errorBuilder: (_, __) => const Text('error'),
); );
expect(find.text('home'), findsOneWidget); expect(find.text('home'), findsOneWidget);
// Sanity check. // Sanity check.
router.goNamed('abc'); router.goNamed('abc');

View File

@ -188,6 +188,7 @@ Future<GoRouter> createRouter(
requestFocus: requestFocus, requestFocus: requestFocus,
overridePlatformDefaultLocation: overridePlatformDefaultLocation, overridePlatformDefaultLocation: overridePlatformDefaultLocation,
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
restorationScopeId: restorationScopeId:
@ -221,6 +222,7 @@ Future<GoRouter> createRouterWithRoutingConfig(
requestFocus: requestFocus, requestFocus: requestFocus,
overridePlatformDefaultLocation: overridePlatformDefaultLocation, overridePlatformDefaultLocation: overridePlatformDefaultLocation,
); );
addTearDown(goRouter.dispose);
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp.router( MaterialApp.router(
restorationScopeId: restorationScopeId:
@ -335,6 +337,12 @@ class DummyRestorableStatefulWidgetState
} }
} }
@override
void dispose() {
_counter.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) => Container(); Widget build(BuildContext context) => Container();
} }