Skip to content

Commit 956999a

Browse files
authored
Make Route dispatching memory events. (#133721)
1 parent 727b9fd commit 956999a

File tree

3 files changed

+52
-2
lines changed

3 files changed

+52
-2
lines changed

packages/flutter/lib/src/widgets/navigator.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,15 @@ abstract class Route<T> {
140140
///
141141
/// If the [settings] are not provided, an empty [RouteSettings] object is
142142
/// used instead.
143-
Route({ RouteSettings? settings }) : _settings = settings ?? const RouteSettings();
143+
Route({ RouteSettings? settings }) : _settings = settings ?? const RouteSettings() {
144+
if (kFlutterMemoryAllocationsEnabled) {
145+
MemoryAllocations.instance.dispatchObjectCreated(
146+
library: 'package:flutter/widgets.dart',
147+
className: '$Route<$T>',
148+
object: this,
149+
);
150+
}
151+
}
144152

145153
/// The navigator that the route is in, if any.
146154
NavigatorState? get navigator => _navigator;
@@ -503,6 +511,9 @@ abstract class Route<T> {
503511
void dispose() {
504512
_navigator = null;
505513
_restorationScopeId.dispose();
514+
if (kFlutterMemoryAllocationsEnabled) {
515+
MemoryAllocations.instance.dispatchObjectDisposed(object: this);
516+
}
506517
}
507518

508519
/// Whether this route is the top-most route on the navigator.

packages/flutter/test/material/app_test.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,10 @@ void main() {
338338
// TODO(polina-c): remove after fixing
339339
// https://github.com/flutter/flutter/issues/133695
340340
leakTrackingTestConfig: const LeakTrackingTestConfig(
341-
notDisposedAllowList: <String, int?> {'ValueNotifier<String?>': 3},
341+
notDisposedAllowList: <String, int?> {
342+
'ValueNotifier<String?>': 3,
343+
'MaterialPageRoute<dynamic>': 3,
344+
},
342345
));
343346

344347
testWidgetsWithLeakTracking('Make sure initialRoute is only used the first time', (WidgetTester tester) async {

packages/flutter/test/widgets/navigator_test.dart

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:flutter/rendering.dart';
1010
import 'package:flutter/scheduler.dart';
1111
import 'package:flutter/services.dart';
1212
import 'package:flutter_test/flutter_test.dart';
13+
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
1314

1415
import 'navigator_utils.dart';
1516
import '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

Comments
 (0)