From afa37891cf36ca16a18998c6558bc03933dc53e6 Mon Sep 17 00:00:00 2001 From: Polina Cherkasova Date: Thu, 24 Aug 2023 13:41:57 -0700 Subject: [PATCH] Users of ChangeNotifier should dispatch event of object creation in constructor. (#133210) --- .../flutter/lib/src/widgets/navigator.dart | 7 +++++++ .../lib/src/widgets/selectable_region.dart | 7 +++++++ .../lib/src/widgets/widget_inspector.dart | 7 +++++++ .../test/foundation/change_notifier_test.dart | 12 ++++++++++++ .../widgets/automatic_keep_alive_test.dart | 7 +++++++ .../route_notification_messages_test.dart | 6 +++++- .../test/widgets/router_restoration_test.dart | 12 ++++++++++++ packages/flutter/test/widgets/router_test.dart | 18 +++++++++++++++--- 8 files changed, 72 insertions(+), 4 deletions(-) diff --git a/packages/flutter/lib/src/widgets/navigator.dart b/packages/flutter/lib/src/widgets/navigator.dart index 4f7041d45b..e93ab22af4 100644 --- a/packages/flutter/lib/src/widgets/navigator.dart +++ b/packages/flutter/lib/src/widgets/navigator.dart @@ -3355,6 +3355,13 @@ typedef _IndexWhereCallback = bool Function(_RouteEntry element); /// Acts as a ChangeNotifier and notifies after its List of _RouteEntries is /// mutated. class _History extends Iterable<_RouteEntry> with ChangeNotifier { + /// Creates an instance of [_History]. + _History() { + if (kFlutterMemoryAllocationsEnabled) { + maybeDispatchObjectCreation(); + } + } + final List<_RouteEntry> _value = <_RouteEntry>[]; int indexWhere(_IndexWhereCallback test, [int start = 0]) { diff --git a/packages/flutter/lib/src/widgets/selectable_region.dart b/packages/flutter/lib/src/widgets/selectable_region.dart index 16711e25d6..f08e20ec25 100644 --- a/packages/flutter/lib/src/widgets/selectable_region.dart +++ b/packages/flutter/lib/src/widgets/selectable_region.dart @@ -1567,6 +1567,13 @@ class _SelectableRegionContainerDelegate extends MultiSelectableSelectionContain /// This class optimize the selection update by keeping track of the /// [Selectable]s that currently contain the selection edges. abstract class MultiSelectableSelectionContainerDelegate extends SelectionContainerDelegate with ChangeNotifier { + /// Creates an instance of [MultiSelectableSelectionContainerDelegate]. + MultiSelectableSelectionContainerDelegate() { + if (kFlutterMemoryAllocationsEnabled) { + maybeDispatchObjectCreation(); + } + } + /// Gets the list of selectables this delegate is managing. List selectables = []; diff --git a/packages/flutter/lib/src/widgets/widget_inspector.dart b/packages/flutter/lib/src/widgets/widget_inspector.dart index 5873aaab7e..66cc2d5abd 100644 --- a/packages/flutter/lib/src/widgets/widget_inspector.dart +++ b/packages/flutter/lib/src/widgets/widget_inspector.dart @@ -2895,6 +2895,13 @@ class _WidgetInspectorState extends State /// Mutable selection state of the inspector. class InspectorSelection with ChangeNotifier { + /// Creates an instance of [InspectorSelection]. + InspectorSelection() { + if (kFlutterMemoryAllocationsEnabled) { + maybeDispatchObjectCreation(); + } + } + /// Render objects that are candidates to be selected. /// /// Tools may wish to iterate through the list of candidates. diff --git a/packages/flutter/test/foundation/change_notifier_test.dart b/packages/flutter/test/foundation/change_notifier_test.dart index a7adb3df31..d766c6198d 100644 --- a/packages/flutter/test/foundation/change_notifier_test.dart +++ b/packages/flutter/test/foundation/change_notifier_test.dart @@ -27,6 +27,12 @@ class A { } class B extends A with ChangeNotifier { + B() { + if (kFlutterMemoryAllocationsEnabled) { + maybeDispatchObjectCreation(); + } + } + @override void test() { notifyListeners(); @@ -35,6 +41,12 @@ class B extends A with ChangeNotifier { } class Counter with ChangeNotifier { + Counter() { + if (kFlutterMemoryAllocationsEnabled) { + maybeDispatchObjectCreation(); + } + } + int get value => _value; int _value = 0; set value(int value) { diff --git a/packages/flutter/test/widgets/automatic_keep_alive_test.dart b/packages/flutter/test/widgets/automatic_keep_alive_test.dart index eb2718fbd0..5869793871 100644 --- a/packages/flutter/test/widgets/automatic_keep_alive_test.dart +++ b/packages/flutter/test/widgets/automatic_keep_alive_test.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart' show DragStartBehavior; import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; @@ -631,6 +632,12 @@ class RenderSliverMultiBoxAdaptorAlt extends RenderSliver with } class LeakCheckerHandle with ChangeNotifier { + LeakCheckerHandle() { + if (kFlutterMemoryAllocationsEnabled) { + maybeDispatchObjectCreation(); + } + } + @override bool get hasListeners => super.hasListeners; } diff --git a/packages/flutter/test/widgets/route_notification_messages_test.dart b/packages/flutter/test/widgets/route_notification_messages_test.dart index 940bf16fba..1d79ee0ed1 100644 --- a/packages/flutter/test/widgets/route_notification_messages_test.dart +++ b/packages/flutter/test/widgets/route_notification_messages_test.dart @@ -338,7 +338,11 @@ class SimpleRouterDelegate extends RouterDelegate with ChangeN required this.builder, this.onPopRoute, this.reportConfiguration = false, - }); + }) { + if (kFlutterMemoryAllocationsEnabled) { + maybeDispatchObjectCreation(); + } + } RouteInformation get routeInformation => _routeInformation; late RouteInformation _routeInformation; diff --git a/packages/flutter/test/widgets/router_restoration_test.dart b/packages/flutter/test/widgets/router_restoration_test.dart index a2568f930b..4892c9c841 100644 --- a/packages/flutter/test/widgets/router_restoration_test.dart +++ b/packages/flutter/test/widgets/router_restoration_test.dart @@ -90,6 +90,12 @@ class _TestRouteInformationParser extends RouteInformationParser { } class _TestRouterDelegate extends RouterDelegate with ChangeNotifier { + _TestRouterDelegate() { + if (kFlutterMemoryAllocationsEnabled) { + maybeDispatchObjectCreation(); + } + } + final List newRoutePaths = []; final List restoredRoutePaths = []; @@ -128,6 +134,12 @@ class _TestRouterDelegate extends RouterDelegate with ChangeNotifier { } class _TestRouteInformationProvider extends RouteInformationProvider with ChangeNotifier { + _TestRouteInformationProvider() { + if (kFlutterMemoryAllocationsEnabled) { + maybeDispatchObjectCreation(); + } + } + @override RouteInformation get value => _value; RouteInformation _value = RouteInformation(uri: Uri.parse('/home')); diff --git a/packages/flutter/test/widgets/router_test.dart b/packages/flutter/test/widgets/router_test.dart index cf46e0fc3d..a552d67b6c 100644 --- a/packages/flutter/test/widgets/router_test.dart +++ b/packages/flutter/test/widgets/router_test.dart @@ -1633,7 +1633,11 @@ class SimpleRouterDelegate extends RouterDelegate with ChangeN this.builder, this.onPopRoute, this.reportConfiguration = false, - }); + }) { + if (kFlutterMemoryAllocationsEnabled) { + maybeDispatchObjectCreation(); + } + } RouteInformation? get routeInformation => _routeInformation; RouteInformation? _routeInformation; @@ -1717,7 +1721,11 @@ class SimpleNavigatorRouterDelegate extends RouterDelegate wit class SimpleRouteInformationProvider extends RouteInformationProvider with ChangeNotifier { SimpleRouteInformationProvider({ this.onRouterReport, - }); + }) { + if (kFlutterMemoryAllocationsEnabled) { + maybeDispatchObjectCreation(); + } + } RouterReportRouterInformation? onRouterReport; @@ -1773,7 +1781,11 @@ class CompleterRouteInformationParser extends RouteInformationParser with ChangeNotifier { SimpleAsyncRouterDelegate({ required this.builder, - }); + }) { + if (kFlutterMemoryAllocationsEnabled) { + maybeDispatchObjectCreation(); + } + } RouteInformation? get routeInformation => _routeInformation; RouteInformation? _routeInformation;