Skip to content

Commit e4d5a4c

Browse files
Address memory leaks with search and filter code (flutter#8975)
1 parent 8cf85e6 commit e4d5a4c

20 files changed

Lines changed: 66 additions & 72 deletions

File tree

packages/devtools_app/lib/src/framework/scaffold/status_line.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ class StatusLine extends StatelessWidget {
7676
final theme = Theme.of(context);
7777
final color = highlightForConnection ? theme.colorScheme.onPrimary : null;
7878
final screenWidth = ScreenSize(context).width;
79+
// TODO(https://github.com/flutter/devtools/issues/8913): this builds the
80+
// wrong status items for offline mode.
7981
final pageStatus = currentScreen.buildStatus(context);
8082
final widerThanXxs = screenWidth > MediaSize.xxs;
8183
final screenMetaData = ScreenMetaData.lookup(currentScreen.screenId);

packages/devtools_app/lib/src/screens/app_size/app_size_screen.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ class _AppSizeBodyState extends State<AppSizeBody>
143143

144144
@override
145145
void dispose() {
146-
super.dispose();
147146
_tabController.dispose();
147+
super.dispose();
148148
}
149149

150150
void _pushErrorMessage(String error) {

packages/devtools_app/lib/src/screens/debugger/codeview.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,6 @@ class _CodeViewState extends State<CodeView> with AutoDisposeMixin {
155155

156156
if (widget.codeViewController != oldWidget.codeViewController) {
157157
cancelListeners();
158-
widget.codeViewController.initSearch();
159158
addAutoDisposeListener(
160159
widget.codeViewController.scriptLocation,
161160
_handleScriptLocationChanged,

packages/devtools_app/lib/src/screens/debugger/file_search.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class FileSearchField extends StatefulWidget {
3030
}
3131

3232
class FileSearchFieldState extends State<FileSearchField>
33-
with AutoDisposeMixin, SearchFieldMixin {
33+
with AutoDisposeMixin {
3434
static final fileSearchFieldKey = GlobalKey(debugLabel: 'fileSearchFieldKey');
3535

3636
final autoCompleteController = AutoCompleteController(fileSearchFieldKey);
@@ -40,9 +40,6 @@ class FileSearchFieldState extends State<FileSearchField>
4040
late String _query;
4141
late FileSearchResults _searchResults;
4242

43-
@override
44-
SearchControllerMixin get searchController => autoCompleteController;
45-
4643
@override
4744
void initState() {
4845
super.initState();

packages/devtools_app/lib/src/screens/inspector/inspector_screen_body.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,7 @@ class InspectorScreenBody extends StatefulWidget {
3737
}
3838

3939
class InspectorScreenBodyState extends State<InspectorScreenBody>
40-
with
41-
BlockingActionMixin,
42-
AutoDisposeMixin,
43-
SearchFieldMixin<InspectorScreenBody> {
40+
with BlockingActionMixin, AutoDisposeMixin {
4441
InspectorController get controller => widget.controller;
4542

4643
InspectorTreeController get _summaryTreeController =>
@@ -51,7 +48,6 @@ class InspectorScreenBodyState extends State<InspectorScreenBody>
5148

5249
bool searchVisible = false;
5350

54-
@override
5551
SearchControllerMixin get searchController => _summaryTreeController;
5652

5753
/// Indicates whether search can be closed. The value is set to true when

packages/devtools_app/lib/src/screens/inspector_v2/inspector_screen_body.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,14 @@ class InspectorScreenBody extends StatefulWidget {
3535
}
3636

3737
class InspectorScreenBodyState extends State<InspectorScreenBody>
38-
with
39-
BlockingActionMixin,
40-
AutoDisposeMixin,
41-
SearchFieldMixin<InspectorScreenBody> {
38+
with BlockingActionMixin, AutoDisposeMixin {
4239
InspectorController get controller => widget.controller;
4340

4441
InspectorTreeController get _inspectorTreeController =>
4542
controller.inspectorTree;
4643

4744
bool searchVisible = false;
4845

49-
@override
5046
SearchControllerMixin get searchController => _inspectorTreeController;
5147

5248
/// Indicates whether search can be closed. The value is set to true when

packages/devtools_app/lib/src/screens/logging/logging_controller.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,6 @@ class LoggingController extends DevToolsScreenController
123123
_handleConnectionStart(serviceConnection.serviceManager.service!);
124124
}
125125
_handleBusEvents();
126-
initFilterController();
127126

128127
addAutoDisposeListener(
129128
preferences.logging.retentionLimit,

packages/devtools_app/lib/src/screens/network/network_controller.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ class NetworkController extends DevToolsScreenController
138138
}
139139

140140
final selectedRequest = ValueNotifier<NetworkRequest?>(null);
141-
late CurrentNetworkRequests _currentNetworkRequests;
141+
142+
final _currentNetworkRequests = CurrentNetworkRequests();
142143

143144
/// Notifies that the timeline is currently being recorded.
144145
ValueListenable<bool> get recordingNotifier => _recordingNotifier;
@@ -169,13 +170,11 @@ class NetworkController extends DevToolsScreenController
169170
@override
170171
void init() {
171172
super.init();
172-
_currentNetworkRequests = CurrentNetworkRequests();
173173
_initHelper();
174174
addAutoDisposeListener(
175175
_currentNetworkRequests,
176176
_filterAndRefreshSearchMatches,
177177
);
178-
initFilterController();
179178
}
180179

181180
@override

packages/devtools_app/lib/src/screens/profiler/cpu_profiler_controller.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,7 @@ class CpuProfilerController extends DisposableController
4848
FilterControllerMixin<CpuStackFrame>,
4949
AutoDisposeControllerMixin {
5050
CpuProfilerController() {
51-
// TODO(https://github.com/flutter/devtools/issues/7727): add support for
52-
// persisting cpu profiler filter.
53-
initFilterController();
51+
super.init();
5452
}
5553

5654
/// Tag to represent when no user tag filters are applied.

packages/devtools_app/lib/src/screens/profiler/panes/method_table/method_table_controller.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,20 @@ class MethodTableController extends DisposableController
2323
MethodTableController({
2424
required ValueListenable<CpuProfileData?> dataNotifier,
2525
}) {
26+
super.init();
2627
createMethodTableGraph(dataNotifier.value);
2728
addAutoDisposeListener(dataNotifier, () {
2829
createMethodTableGraph(dataNotifier.value);
2930
});
3031
}
3132

33+
@override
34+
void dispose() {
35+
selectedNode.dispose();
36+
_methods.dispose();
37+
super.dispose();
38+
}
39+
3240
final selectedNode = ValueNotifier<MethodTableGraphNode?>(null);
3341

3442
ValueListenable<List<MethodTableGraphNode>> get methods => _methods;

0 commit comments

Comments
 (0)