From 44523e7118543f783e4bf174e53d741053cd7562 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Tue, 21 Jul 2026 15:54:32 -0700 Subject: [PATCH 01/10] Add check-unused-code to DCM CI checks. --- .github/workflows/build.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d1fd75d9c0a..a4abae7fa9c 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -79,9 +79,13 @@ jobs: echo "$(dcm --version)" - name: Setup Dart SDK uses: dart-lang/setup-dart@e51d8e571e22473a2ddebf0ef8a2123f0ab2c02c - - name: Run DCM on root + - name: Run dcm analyze on root run: | dcm analyze packages/devtools_app packages/devtools_app_shared packages/devtools_extensions packages/devtools_shared packages/devtools_test + - name: Run dcm checks on packages + # TODO(https://github.com/flutter/devtools/issues/9906): run on all packages. + run: | + dcm check-unused-code packages/devtools_app test-packages: name: ${{ matrix.os }} ${{ matrix.package }} test From 76e7220f7abf487b488c6e6df7e089b68488e3da Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Tue, 21 Jul 2026 15:57:02 -0700 Subject: [PATCH 02/10] exclude public API --- .github/workflows/build.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index a4abae7fa9c..125a7ca0e6b 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -83,9 +83,9 @@ jobs: run: | dcm analyze packages/devtools_app packages/devtools_app_shared packages/devtools_extensions packages/devtools_shared packages/devtools_test - name: Run dcm checks on packages - # TODO(https://github.com/flutter/devtools/issues/9906): run on all packages. + # TODO(https://github.com/flutter/devtools/issues/9906): run on all DevTools packages. run: | - dcm check-unused-code packages/devtools_app + dcm check-unused-code packages/devtools_app --exclude-public-api test-packages: name: ${{ matrix.os }} ${{ matrix.package }} test From 93ec692f4146672ac23a6e9c089a25bc22ae6387 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Tue, 21 Jul 2026 16:05:02 -0700 Subject: [PATCH 03/10] Add excludes --- analysis_options.yaml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/analysis_options.yaml b/analysis_options.yaml index f59d8d0ede5..9c0b00deb23 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -156,6 +156,19 @@ dart_code_metrics: maximum-nesting-level: 5 metrics-exclude: - test/** + exclude: + unused-code: + # TODO(https://github.com/dart-lang/sdk/issues/63864): clean up these + # paths once this issue is fixed. These paths are currently relative to + # devtools_app/. + # TODO(https://github.com/flutter/devtools/issues/9906) remove these + # excludes as findings are resolved. + - lib/src/extensions/** + - lib/src/framework/** + - lib/src/screens/** + - lib/src/shared/** + - lib/src/standalone_ui/** + - test/ rules: # - arguments-ordering Too strict # - avoid-banned-imports # TODO(polina-c): add configuration From 6ebb76b19dfe4a540a810841187a1042fa364103 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Tue, 21 Jul 2026 16:06:32 -0700 Subject: [PATCH 04/10] exclude test/ --- analysis_options.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 9c0b00deb23..ddb75b26666 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -168,7 +168,7 @@ dart_code_metrics: - lib/src/screens/** - lib/src/shared/** - lib/src/standalone_ui/** - - test/ + - test/** rules: # - arguments-ordering Too strict # - avoid-banned-imports # TODO(polina-c): add configuration From 00d014e641a1256a5a4ea6ff652af85ba6155212 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Tue, 21 Jul 2026 16:08:03 -0700 Subject: [PATCH 05/10] exclude service/ --- analysis_options.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/analysis_options.yaml b/analysis_options.yaml index ddb75b26666..314eb64b341 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -166,6 +166,7 @@ dart_code_metrics: - lib/src/extensions/** - lib/src/framework/** - lib/src/screens/** + - lib/src/service/** - lib/src/shared/** - lib/src/standalone_ui/** - test/** From 0b896c5809279700fb79d9a1386dda139b465017 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Tue, 21 Jul 2026 16:09:26 -0700 Subject: [PATCH 06/10] exclude integration_test/ --- analysis_options.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/analysis_options.yaml b/analysis_options.yaml index 314eb64b341..d6dd068cd84 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -163,6 +163,7 @@ dart_code_metrics: # devtools_app/. # TODO(https://github.com/flutter/devtools/issues/9906) remove these # excludes as findings are resolved. + - integration_test/** - lib/src/extensions/** - lib/src/framework/** - lib/src/screens/** From 6d414f7e62a93785633b7762852a94a15d4c7be8 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Tue, 21 Jul 2026 16:11:10 -0700 Subject: [PATCH 07/10] Ignore false positives in app.dart. --- packages/devtools_app/lib/src/app.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/devtools_app/lib/src/app.dart b/packages/devtools_app/lib/src/app.dart index e51ec18c84a..b19f4506f84 100644 --- a/packages/devtools_app/lib/src/app.dart +++ b/packages/devtools_app/lib/src/app.dart @@ -618,7 +618,9 @@ typedef UrlParametersBuilder = /// /// This avoids issues with widgets in the appbar being hidden by the banner /// in a web or desktop app. +// ignore: unused-code, TODO(https://github.com/flutter/devtools/issues/9907): false positive. class _AlternateCheckedModeBanner extends StatelessWidget { + // ignore: unused-code, TODO(https://github.com/flutter/devtools/issues/9907): false positive. const _AlternateCheckedModeBanner({required this.builder}); final WidgetBuilder builder; From 03c168c2326162a59839455e4d50547254348dc2 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Tue, 21 Jul 2026 16:16:10 -0700 Subject: [PATCH 08/10] Remove unused code in extensions/ and framework/ --- analysis_options.yaml | 2 -- .../lib/src/extensions/embedded/_controller_web.dart | 1 + .../lib/src/extensions/embedded/_view_desktop.dart | 7 ++++--- .../devtools_app/lib/src/extensions/extension_service.dart | 1 + packages/devtools_app/lib/src/framework/home_screen.dart | 3 +-- packages/devtools_app/lib/src/framework/release_notes.dart | 1 + .../lib/src/framework/scaffold/status_line.dart | 2 -- 7 files changed, 8 insertions(+), 9 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index d6dd068cd84..e57f4c29d8e 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -164,8 +164,6 @@ dart_code_metrics: # TODO(https://github.com/flutter/devtools/issues/9906) remove these # excludes as findings are resolved. - integration_test/** - - lib/src/extensions/** - - lib/src/framework/** - lib/src/screens/** - lib/src/service/** - lib/src/shared/** diff --git a/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart b/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart index 388fe7ab9d8..bdcc3f16bf0 100644 --- a/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart +++ b/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart @@ -78,6 +78,7 @@ class EmbeddedExtensionControllerImpl extends EmbeddedExtensionController final extensionPostEventStream = StreamController.broadcast(); + // ignore: unused-code, TODO(https://github.com/flutter/devtools/issues/9907): false positive. bool _initialized = false; @override diff --git a/packages/devtools_app/lib/src/extensions/embedded/_view_desktop.dart b/packages/devtools_app/lib/src/extensions/embedded/_view_desktop.dart index 5d9403f6ce8..051461bbbe0 100644 --- a/packages/devtools_app/lib/src/extensions/embedded/_view_desktop.dart +++ b/packages/devtools_app/lib/src/extensions/embedded/_view_desktop.dart @@ -7,9 +7,10 @@ import 'package:flutter/material.dart'; import 'controller.dart'; class EmbeddedExtension extends StatelessWidget { - const EmbeddedExtension({super.key, required this.controller}); - - final EmbeddedExtensionController controller; + const EmbeddedExtension({ + super.key, + required EmbeddedExtensionController controller, + }); @override Widget build(BuildContext context) { diff --git a/packages/devtools_app/lib/src/extensions/extension_service.dart b/packages/devtools_app/lib/src/extensions/extension_service.dart index 2c7513b48ca..ae49a3b7022 100644 --- a/packages/devtools_app/lib/src/extensions/extension_service.dart +++ b/packages/devtools_app/lib/src/extensions/extension_service.dart @@ -70,6 +70,7 @@ class ExtensionService extends DisposableController /// /// This set of extensions will include one version of a DevTools extension /// per package. + @visibleForTesting List get availableExtensions => _currentExtensions.value.availableExtensions; diff --git a/packages/devtools_app/lib/src/framework/home_screen.dart b/packages/devtools_app/lib/src/framework/home_screen.dart index 7b02646f24e..e7b3781aadb 100644 --- a/packages/devtools_app/lib/src/framework/home_screen.dart +++ b/packages/devtools_app/lib/src/framework/home_screen.dart @@ -32,8 +32,6 @@ class HomeScreen extends Screen { titleGenerator: () => devToolsTitle.value, ); - static final id = ScreenMetaData.home.id; - final List sampleData; @override @@ -171,6 +169,7 @@ class _ConnectInputState extends State with BlockingActionMixin { }()); } + // ignore: unused-code, TODO(https://github.com/flutter/devtools/issues/9907): false positive. void _debugInitVmServiceCache() async { // We only do this in debug mode as it speeds iteration for DevTools // developers who tend to repeatedly restart DevTools to debug the same diff --git a/packages/devtools_app/lib/src/framework/release_notes.dart b/packages/devtools_app/lib/src/framework/release_notes.dart index f6ea52ca9aa..f7632c6eaf0 100644 --- a/packages/devtools_app/lib/src/framework/release_notes.dart +++ b/packages/devtools_app/lib/src/framework/release_notes.dart @@ -28,6 +28,7 @@ bool debugTestReleaseNotes = false; // from the flutter/website PR, which has a GitHub action that automatically // stages commits to firebase. Example: // https://flutter-docs-prod--pr12652-devtools-release-notes-2-52-3bbb8c0u.web.app/tools/devtools/release-notes/release-notes-2.52.0.md. +// ignore: unused-code, debug-only feature. String? _debugReleaseNotesUrl; const releaseNotesKey = Key('release_notes'); diff --git a/packages/devtools_app/lib/src/framework/scaffold/status_line.dart b/packages/devtools_app/lib/src/framework/scaffold/status_line.dart index 16133d36a29..54e78dc2954 100644 --- a/packages/devtools_app/lib/src/framework/scaffold/status_line.dart +++ b/packages/devtools_app/lib/src/framework/scaffold/status_line.dart @@ -37,8 +37,6 @@ class StatusLine extends StatelessWidget { /// Whether to highlight the footer when DevTools is connected to an app. final bool highlightForConnection; - static const deviceInfoTooltip = 'Device Info'; - /// The padding around the footer in the DevTools UI. EdgeInsets get padding => const EdgeInsets.symmetric( horizontal: defaultSpacing, From 1e8add7c765fca92a52c4b22a6c13ba8c4322d45 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Tue, 21 Jul 2026 16:18:10 -0700 Subject: [PATCH 09/10] use if (kDebugMode) --- packages/devtools_app/lib/src/framework/home_screen.dart | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/devtools_app/lib/src/framework/home_screen.dart b/packages/devtools_app/lib/src/framework/home_screen.dart index e7b3781aadb..c3fceb32168 100644 --- a/packages/devtools_app/lib/src/framework/home_screen.dart +++ b/packages/devtools_app/lib/src/framework/home_screen.dart @@ -163,13 +163,9 @@ class _ConnectInputState extends State with BlockingActionMixin { void initState() { super.initState(); connectDialogController = TextEditingController(); - assert(() { - _debugInitVmServiceCache(); - return true; - }()); + if (kDebugMode) _debugInitVmServiceCache(); } - // ignore: unused-code, TODO(https://github.com/flutter/devtools/issues/9907): false positive. void _debugInitVmServiceCache() async { // We only do this in debug mode as it speeds iteration for DevTools // developers who tend to repeatedly restart DevTools to debug the same From 6c3805741433e8976ebaeaa6392c68c0aca0e61b Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Tue, 21 Jul 2026 16:19:34 -0700 Subject: [PATCH 10/10] remove other assert --- packages/devtools_app/lib/src/app.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/devtools_app/lib/src/app.dart b/packages/devtools_app/lib/src/app.dart index b19f4506f84..b948d84edec 100644 --- a/packages/devtools_app/lib/src/app.dart +++ b/packages/devtools_app/lib/src/app.dart @@ -242,12 +242,11 @@ class DevToolsAppState extends State with AutoDisposeMixin { // Provide the appropriate page route. if (pages.containsKey(page)) { Widget widget = pages[page]!(context, page, params, state); - assert(() { + if (kDebugMode) { widget = _AlternateCheckedModeBanner( builder: (context) => pages[page]!(context, page, params, state), ); - return true; - }()); + } return MaterialPage(child: widget); }