@@ -10,6 +10,7 @@ import 'package:flutter/rendering.dart';
1010import 'package:flutter/scheduler.dart' ;
1111import 'package:flutter/services.dart' ;
1212import 'package:flutter_test/flutter_test.dart' ;
13+ import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart' ;
1314
1415import 'navigator_utils.dart' ;
1516import 'observer_tester.dart' ;
@@ -627,6 +628,41 @@ void main() {
627628 expect (observations[2 ].previous, '/A' );
628629 });
629630
631+ testWidgetsWithLeakTracking ('$Route dispatches memory events' , (WidgetTester tester) async {
632+ Future <void > createAndDisposeRoute () async {
633+ final GlobalKey <NavigatorState > nav = GlobalKey <NavigatorState >();
634+ await tester.pumpWidget (
635+ MaterialApp (
636+ navigatorKey: nav,
637+ home: const Scaffold (
638+ body: Text ('home' ),
639+ )
640+ )
641+ );
642+
643+ nav.currentState! .push (MaterialPageRoute <void >(builder: (_) => const Placeholder ())); // This should create a route
644+ await tester.pumpAndSettle ();
645+
646+ nav.currentState! .pop ();
647+ await tester.pumpAndSettle (); // this should dispose the route.
648+ }
649+
650+ final List <ObjectEvent > events = < ObjectEvent > [];
651+ void listener (ObjectEvent event) {
652+ if (event.object.runtimeType == MaterialPageRoute <void >) {
653+ events.add (event);
654+ }
655+ }
656+ MemoryAllocations .instance.addListener (listener);
657+
658+ await createAndDisposeRoute ();
659+ expect (events, hasLength (2 ));
660+ expect (events.first, isA <ObjectCreated >());
661+ expect (events.last, isA <ObjectDisposed >());
662+
663+ MemoryAllocations .instance.removeListener (listener);
664+ });
665+
630666 testWidgets ('Route didAdd and dispose in same frame work' , (WidgetTester tester) async {
631667 // Regression Test for https://github.com/flutter/flutter/issues/61346.
632668 Widget buildNavigator () {
0 commit comments