Skip to content

Commit f52f72d

Browse files
Enable dispose-class-fields and dispose-fields lints to resolve memory leaks (#9857)
1 parent da43067 commit f52f72d

50 files changed

Lines changed: 227 additions & 52 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ jobs:
7474
wget -qO- https://dcm.dev/pgp-key.public | sudo gpg --dearmor -o /usr/share/keyrings/dcm.gpg
7575
echo 'deb [signed-by=/usr/share/keyrings/dcm.gpg arch=amd64] https://dcm.dev/debian stable main' | sudo tee /etc/apt/sources.list.d/dart_stable.list
7676
sudo apt-get update
77-
sudo apt-get install dcm=1.36.0-1 # To avoid errors add `-1` (build number) to the version
77+
sudo apt-get install dcm=1.38.1-1 # To avoid errors add `-1` (build number) to the version
7878
sudo chmod +x /usr/bin/dcm
7979
echo "$(dcm --version)"
8080
- name: Setup Dart SDK

analysis_options.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,8 @@ dart_code_metrics:
186186
- avoid-explicit-type-declaration
187187
# - ban-name # TODO(polina-c): add configuration
188188
# - binary-expression-operand-order Some nice catches but too many false positives to enable.
189+
- dispose-class-fields
190+
- dispose-fields
189191
- double-literal-format
190192
# - format-comment TODO(jacobr): enable this one after fixing violations.
191193
# TODO(jacobr): enable member-ordering. This catches a bunch of real style

packages/devtools_app/lib/src/app.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ class DevToolsAppState extends State<DevToolsApp> with AutoDisposeMixin {
202202
FrameworkCore.dispose();
203203
// Workaround for https://github.com/flutter/flutter/issues/155265.
204204
removeTextFieldFocusFixHandler();
205+
routerDelegate.dispose();
205206
super.dispose();
206207
}
207208

packages/devtools_app/lib/src/extensions/embedded/_view_web.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class _EmbeddedExtensionState extends State<EmbeddedExtension>
4646

4747
@override
4848
void dispose() {
49+
_embeddedExtensionController.dispose();
4950
iFrameController.dispose();
5051
super.dispose();
5152
}

packages/devtools_app/lib/src/framework/notifications_view.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,10 @@ class _NotificationsState extends State<_Notifications> with AutoDisposeMixin {
8686

8787
@override
8888
void dispose() {
89-
_overlayEntry!.remove();
89+
_overlayEntry
90+
?..remove()
91+
..dispose();
92+
_overlayEntry = null;
9093
super.dispose();
9194
}
9295

@@ -218,6 +221,7 @@ class _NotificationState extends State<_Notification>
218221
void dispose() {
219222
controller.dispose();
220223
_dismissTimer?.cancel();
224+
curve.dispose();
221225
super.dispose();
222226
}
223227

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ class DebuggerController extends DevToolsScreenController
8989
_selectedBreakpoint.dispose();
9090
_exceptionPauseMode.dispose();
9191
_hasTruncatedFrames.dispose();
92+
unawaited(_getStackOperation?.cancel());
93+
_lastService = null;
9294
super.dispose();
9395
}
9496

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,8 @@ class InspectorController extends DisposableController
200200
/// for now mainly to minimize risk.
201201
static const refreshFramesPerSecond = 5.0;
202202

203-
InspectorTreeController inspectorTree;
203+
final InspectorTreeController inspectorTree;
204+
204205
final FlutterTreeType treeType;
205206

206207
late RateLimiter _refreshRateLimiter;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -914,6 +914,8 @@ class _InspectorTreeState extends State<InspectorTree>
914914
Rect? _currentAnimateTarget;
915915

916916
AnimationController? _constraintDisplayController;
917+
918+
// ignore: dispose-fields, false positive. Disposed via autoDisposeFocusNode.
917919
late FocusNode _focusNode;
918920

919921
/// When autoscrolling, the number of rows to pad the target location with.

packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/flex.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,12 @@ class FlexLayoutExplorerWidgetState
394394
),
395395
);
396396
}
397+
398+
@override
399+
void dispose() {
400+
scrollController.dispose();
401+
super.dispose();
402+
}
397403
}
398404

399405
class VisualizeFlexChildren extends StatefulWidget {

packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/layout_explorer_widget.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,9 @@ abstract class LayoutExplorerWidgetState<
162162
entranceController.dispose();
163163
changeController.dispose();
164164
_unregisterInspectorControllerService();
165+
entranceCurve.dispose();
166+
changeAnimation.dispose();
167+
rateLimiter.dispose();
165168
super.dispose();
166169
}
167170

0 commit comments

Comments
 (0)