Unverified Commit 956999a4 authored by Polina Cherkasova's avatar Polina Cherkasova Committed by GitHub

Make Route dispatching memory events. (#133721)

parent 727b9fd1
......@@ -140,7 +140,15 @@ abstract class Route<T> {
///
/// If the [settings] are not provided, an empty [RouteSettings] object is
/// used instead.
Route({ RouteSettings? settings }) : _settings = settings ?? const RouteSettings();
Route({ RouteSettings? settings }) : _settings = settings ?? const RouteSettings() {
if (kFlutterMemoryAllocationsEnabled) {
MemoryAllocations.instance.dispatchObjectCreated(
library: 'package:flutter/widgets.dart',
className: '$Route<$T>',
object: this,
);
}
}
/// The navigator that the route is in, if any.
NavigatorState? get navigator => _navigator;
......@@ -503,6 +511,9 @@ abstract class Route<T> {
void dispose() {
_navigator = null;
_restorationScopeId.dispose();
if (kFlutterMemoryAllocationsEnabled) {
MemoryAllocations.instance.dispatchObjectDisposed(object: this);
}
}
/// Whether this route is the top-most route on the navigator.
......
......@@ -338,7 +338,10 @@ void main() {
// TODO(polina-c): remove after fixing
// https://github.com/flutter/flutter/issues/133695
leakTrackingTestConfig: const LeakTrackingTestConfig(
notDisposedAllowList: <String, int?> {'ValueNotifier<String?>': 3},
notDisposedAllowList: <String, int?> {
'ValueNotifier<String?>': 3,
'MaterialPageRoute<dynamic>': 3,
},
));
testWidgetsWithLeakTracking('Make sure initialRoute is only used the first time', (WidgetTester tester) async {
......
......@@ -10,6 +10,7 @@ import 'package:flutter/rendering.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'navigator_utils.dart';
import 'observer_tester.dart';
......@@ -627,6 +628,41 @@ void main() {
expect(observations[2].previous, '/A');
});
testWidgetsWithLeakTracking('$Route dispatches memory events', (WidgetTester tester) async {
Future<void> createAndDisposeRoute() async {
final GlobalKey<NavigatorState> nav = GlobalKey<NavigatorState>();
await tester.pumpWidget(
MaterialApp(
navigatorKey: nav,
home: const Scaffold(
body: Text('home'),
)
)
);
nav.currentState!.push(MaterialPageRoute<void>(builder: (_) => const Placeholder())); // This should create a route
await tester.pumpAndSettle();
nav.currentState!.pop();
await tester.pumpAndSettle(); // this should dispose the route.
}
final List<ObjectEvent> events = <ObjectEvent>[];
void listener(ObjectEvent event) {
if (event.object.runtimeType == MaterialPageRoute<void>) {
events.add(event);
}
}
MemoryAllocations.instance.addListener(listener);
await createAndDisposeRoute();
expect(events, hasLength(2));
expect(events.first, isA<ObjectCreated>());
expect(events.last, isA<ObjectDisposed>());
MemoryAllocations.instance.removeListener(listener);
});
testWidgets('Route didAdd and dispose in same frame work', (WidgetTester tester) async {
// Regression Test for https://github.com/flutter/flutter/issues/61346.
Widget buildNavigator() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment