detect_unused_code 3.3.0 copy "detect_unused_code: ^3.3.0" to clipboard
detect_unused_code: ^3.3.0 copied to clipboard

Fast, zero-dependency Dart & Flutter dead code, assets, and packages remediation engine. Safely cleans unused classes, imports, assets, and dependencies.

detect_unused_code #

pub package Pub Points Dart SDK License: MIT GitHub Stars

A fast, zero-dependency Dart and Flutter dead code detector and automated remediation engine. Safely detects and cleans dead classes, unused widgets, commented-out files, dead code blocks, unused imports, unused variables, pending TODO tasks, unreferenced media assets, and unused/duplicate external packages across Dart and Flutter projects and monorepos.

Works with zero external dependencies, runs on any Dart SDK from 2.17.0 up to Dart 3.x / 4.x, and supports both CLI usage and programmatic Dart API.


Why Is This Critical for Medium & Large Projects? #

Standard dart analyze / flutter analyze is great for syntax and unused private fields, but it cannot detect unused public classes, widgets, or models. In Dart, public classes are considered potential library exports, so the compiler will never warn you if a public Widget, Controller, or Model is completely abandoned.

In growing codebases (50+ to 1,000+ files), technical debt accumulates fast:

  • Forgotten Widgets & Screens: Refactored pages leave behind dialogs, input fields, and widgets that nothing references anymore.
  • 100% Commented-Out Files: Old implementations commented out with /* ... */ during a quick fix and forgotten forever.
  • Dead Code Blocks: Large chunks of abandoned logic (15+ lines) remaining inside active production files.
  • Orphaned Public Classes: Helper classes used in only one file that should either be private (_) or deleted.
  • Accumulated Technical Debt: Unused imports, dead variables, dead expressions, and forgotten // TODO: notes.

This tool solves that gap by scanning your entire workspace, cross-referencing declarations against active code, running comprehensive static analysis, and reporting exact file paths and line numbers in seconds.


What It Audits (13 Code Quality Points) #

Running detect_unused_code without any arguments automatically performs a comprehensive scan covering all 13 points:

  1. Unused & Dead Classes: Declared classes, widgets, mixins, enums, extensions, and controllers that have 0 references across the entire workspace.
  2. File-Internal Only Public Classes: Public classes that are only used inside their declaring file (candidates to become private _ or to be deleted).
  3. Fully Commented-Out Files: Files where 90%+ of the content is commented-out code (extracts the commented class names).
  4. Heavily Commented Files: Active files exceeding a configurable comment percentage threshold (default: 60%).
  5. Large Dead Code Blocks: Abandoned multi-line code blocks commented out inside active files (default: 15+ consecutive lines).
  6. TODO Comments & Pending Tasks: Tracks pending // TODO: ... and /* TODO ... */ tasks with exact line numbers and descriptions.
  7. Unused Imports (unused_import): Imports declared in a file that are never referenced.
  8. Unnecessary Imports (unnecessary_import): Redundant or duplicated imports.
  9. Unused Local Variables (unused_local_variable): Local variables initialized but never read.
  10. Unused Fields (unused_field): Private/internal class fields that are never accessed.
  11. Unused Elements (unused_element): Private functions, methods, or declarations that have zero calls.
  12. Dead Code (dead_code): Unreachable code blocks (e.g. following a return or break statement).
  13. Dead Null-Aware Expressions (dead_null_aware_expression): Unnecessary ?. operators applied to non-nullable expressions.

๐ŸŽ›๏ธ Interactive Terminal Control Dashboard (TUI) #

Running detect_unused or detect_unused_code without any flags instantly opens the rich Interactive Terminal Dashboard. It first displays a live multi-stage audit progress bar, then opens the interactive control panel with category toggling, dry-run previews, staged safe cleanup, and instant rollback:

$ detect_unused

โณ Initializing workspace audit...
โณ [1/3 Code AST] [โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ] 100% | Completed!
โณ [2/3 Packages] [โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ] 100% | Scanning dependencies...
โณ [3/3 Assets]   [โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ] 100% | Auditing media assets...

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๐Ÿ” DETECT_UNUSED_CODE - INTERACTIVE CONTROL DASHBOARD (v3.2.0)         โ”‚
โ”‚ โšก Powered by @mdalhagg | https://github.com/mdalhagg                  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ [1] [X] ๐Ÿ’€ Dead Classes & Widgets (0 found)                            โ”‚
โ”‚ [2] [X] ๐Ÿ“ฆ Dead Commented Code Blocks (2 files)                        โ”‚
โ”‚ [3] [X] ๐Ÿšซ 100% Commented Files (0 files)                              โ”‚
โ”‚ [4] [X] ๐Ÿ“ฆ Unused External Packages (0 packages)                       โ”‚
โ”‚ [5] [X] ๐Ÿ–ผ๏ธ  Unused Media Assets & Fonts (0 files (0 B))               โ”‚
โ”‚ [6] [ ] ๐Ÿ“‹ TODO Pending Tasks (12 notes)                               โ”‚
โ”‚ [7] [X] ๐Ÿงน Unused & Redundant Imports (0 imports)                      โ”‚
โ”‚ [8] [X] ๐Ÿ’€ Dead Code & Null-Aware (0 items)                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Commands:                                                              โ”‚
โ”‚  [1-8] Toggle category     [A] Toggle All        [V] View details      โ”‚
โ”‚  [D] Preview (Dry Run)     [C] Clean Selected    [U] Undo last action  โ”‚
โ”‚  [M] Export Markdown       [Q] Quit                                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
Select an option:

Dashboard Key Features & Controls #

  • Live Visual Progress Bars: Real-time feedback across Code AST, Packages, and Media Assets so you can monitor progress on large projects (1,000+ files).
  • [1-8] Toggle Category: Enable or disable specific cleanup targets interactively before executing cleanup.
  • [V] View Details: Inspect detected items with exact file paths and dead block line ranges (โ†ณ Lines [L771 - L1260] (490 lines, ~91 lines code)).
  • [D] Preview (Dry Run): Safely simulate cleanup without modifying any files on disk.
  • [C] Clean Selected: Executes defensive multi-stage cleanup, followed by an automatic verification re-audit to verify code health before returning to the dashboard.
  • [U] Undo Last Action: Instant rollback to restore files from the previous snapshot backup.
  • [M] Export Markdown: Generates a CI/CD-ready GitHub Flavored Markdown (GFM) summary report.
  • [Q] Quit: Exit the dashboard cleanly.

๐Ÿ”Ž Detailed Non-Interactive Audit Report (--scan / CI/CD) #

When running in headless environments, CI/CD, or with --scan, the auditor outputs a comprehensive terminal report:

$ detect_unused --scan

โณ Loading & Analyzing: [โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ] 100% | Completed!

==============================================================================
๐Ÿ”Ž DEAD CODE & COMPREHENSIVE CODE AUDITOR REPORT
๐Ÿ“ Target Scope: [.]
๐Ÿ“„ Dart Files:   59 scanned (out of 763 total in project)
==============================================================================

๐Ÿšซ ใ€1. Fully Commented-Out Files (100% Comments)ใ€‘ - (2 files):
   ๐Ÿ”ด [100% comments | 191 lines]: lib/presentation/pages/header.dart
      โ†ณ Commented classes found inside: [ Header ]
   ๐Ÿ”ด [100% comments | 214 lines]: lib/presentation/widgets/multiselect.dart
      โ†ณ Commented classes found inside: [ DropDownMultiSelect ]

๐Ÿ“ฆ ใ€3. Active Files with Large Commented Code Blocks (>= 15 lines)ใ€‘ - (2 files):
   ๐ŸŸก lib/main.dart
      โ†ณ Lines [L400 - L414] (15 lines, 3 lines containing Dart syntax)
   ๐ŸŸก lib/controllers/cart_controller.dart
      โ†ณ Lines [L152 - L178] (27 lines, 6 lines containing Dart syntax)

------------------------------------------------------------------------------

๐Ÿ’€ ใ€4. Unused & Dead Classes (Zero Project-wide References)ใ€‘ - (3 classes):
   ๐Ÿ”น Category [Widget/Page] (2):
      โŒ [Public] DateInputField                   ๐Ÿ“ lib/components/date_input.dart:262
      โŒ [Public] LastOrdersView                   ๐Ÿ“ lib/views/last_orders_view.dart:3
   ๐Ÿ”น Category [Class] (1):
      โŒ [Public] LegacyPaymentHelper              ๐Ÿ“ lib/utils/payment_helper.dart:48

๐Ÿ  ใ€5. File-Internal Only Public Classesใ€‘ - (1 classes):
   ๐Ÿ”ธ _InternalFormatter                (Internal references: 4) ๐Ÿ“ lib/utils/formatter.dart:22

------------------------------------------------------------------------------

๐Ÿ“‹ ใ€6. TODO Comments & Pending Tasksใ€‘ - (2 items):
   ๐Ÿ“ [L14  ] lib/main.dart:14 โžœ implement initState
   ๐Ÿ“ [L89  ] lib/services/api.dart:89 โžœ add retry timeout logic

------------------------------------------------------------------------------

๐Ÿ” ใ€7. Dart Analyzer Diagnostics (Unused & Dead Elements)ใ€‘ - (3 items):
   ๐Ÿ“ฆ [Unused & Unnecessary Imports] (1):
      โŒ lib/views/home.dart:3:8 โžœ Unused import: 'package:http/http.dart'.
   ๐Ÿท๏ธ [Unused Local Variables & Fields] (1):
      โŒ lib/controllers/user_controller.dart:42:9 โžœ The value of the local variable 'tempToken' isn't used.
   ๐Ÿ’€ [Dead Code & Null-Aware Expressions] (1):
      โŒ lib/utils/formatters.dart:30:12 โžœ Dead code.

==============================================================================
๐Ÿ“Š FINAL AUDIT SUMMARY:
   - Fully commented-out files:          2
   - Heavily commented files:            0
   - Files with dead code blocks:        2
   - Dead classes (Zero usages):         3
   - File-internal only classes:         1
   - TODO pending tasks:                 2
   - Unused imports:                     1
   - Unused variables & fields:          1
   - Unused elements:                    0
   - Dead code & null-aware expr:        1
==============================================================================

Installation #

As a Global CLI Tool #

dart pub global activate detect_unused_code

As a Dev Dependency (in pubspec.yaml) #

dev_dependencies:
  detect_unused_code: ^3.3.0

CLI Usage #

You can run the tool using the convenient short command detect_unused or the full package name detect_unused_code.

Default All-in-One Run (All 13 Checks) #

# Using the short command (recommended):
detect_unused

# Or using the full command name:
detect_unused_code

# Or via dart run inside your project:
dart run detect_unused_code

Target Specific Folder or File #

# Scan a specific directory
detect_unused --path=lib/features/checkout

# Scan a single file
detect_unused lib/services/payment_service.dart

Filtering & Tuning Flags #

# Audit only TODO comments
detect_unused --todos-only

# Audit only Dart analyzer diagnostics (unused imports, variables, dead code)
detect_unused --diagnostics-only

# Audit only unused/dead classes
detect_unused --unused-classes

# Audit only commented-out files and code blocks
detect_unused --commented

# Disable TODO inspection in full audit
detect_unused --no-todos

# Disable Dart analyzer diagnostics in full audit
detect_unused --no-diagnostics

# Custom comment threshold (e.g. flag files with 75%+ comments)
detect_unused --threshold 75

# Set minimum lines for commented code blocks
detect_unused --min-lines 20

# Export full analysis to a JSON file (creates detect_unused_code.json in current directory)
detect_unused --json

# Or specify a custom output JSON file name
detect_unused --json=audit_report.json

# Show code snippets for detected dead blocks
detect_unused -v

๐ŸŽ›๏ธ Interactive Dashboard CLI Flags & Instant Rollback (v3.2.0) #

While running detect_unused launches the interactive dashboard automatically, you can also control or automate it directly via CLI flags:

# Launch the Interactive Terminal UI (TUI) Dashboard (Default behavior):
detect_unused

# Or using the full executable name:
detect_unused_code

# Run standard non-interactive terminal audit instead of dashboard:
detect_unused --scan

# Launch dashboard with explicit flag:
detect_unused --interactive

# Instant single-step rollback of the latest cleanup snapshot:
detect_unused --undo
# or simply:
detect_unused undo

# Generate a CI/CD GitHub Flavored Markdown (GFM) summary report:
detect_unused --markdown
# or save to a custom file:
detect_unused --markdown=AUDIT_SUMMARY.md

๐Ÿงน Automated Cleanup & Remediation Engine (v2.0+ / v2.2+ / v2.3+ / v3.0+) #

Versions 2.0+, 2.2+, 2.3+, and 3.0+ introduce a defensive code remediation engine. It automatically resolves detected issues across a phased 9-stage pipeline while maintaining snapshot backups and verified compilation health:

# 1. Remediate ALL detected safe issues with automatic snapshot backup & confirmation
detect_unused --clean-all

# 2. Preview planned changes without modifying any files on disk
detect_unused --clean-all --dry-run

# 3. Clean specific categories individually
detect_unused --clean-commented-files    # Deletes 100% commented-out files
detect_unused --clean-dead-blocks        # Removes dead commented-out code blocks
detect_unused --clean-dead-classes       # Removes zero-usage dead classes and widgets
detect_unused --privatize-internal       # Converts file-internal public classes to _ClassName
detect_unused --clean-todos              # Strips and cleans pending // TODO lines
detect_unused --clean-unused-imports     # Removes unused and unnecessary imports
detect_unused --clean-dead-code          # Replaces dead null-aware ?. with . and cleans dead code
detect_unused --clean-assets             # Deletes unused media assets and unregisters from pubspec.yaml
detect_unused --clean-packages           # Removes unused and duplicate external dependencies from pubspec.yaml

# 4. Skip confirmation prompt for CI/CD or automated scripts
detect_unused --clean-all -y

# 5. Instant single-step rollback of the latest cleanup
detect_unused --undo

# 6. List all snapshot backups
detect_unused --backups

# 7. Rollback to any previous backup snapshot (auto-cleans snapshot upon restore to save space)
detect_unused --restore 1

# 8. Rollback to the most recent backup
detect_unused --restore-latest

# 9. Rollback while keeping the snapshot archive on disk
detect_unused --restore 1 --keep-backup

# 10. Wipe all snapshot archives to reclaim disk space
detect_unused --clean-backups

# 11. Display package version
detect_unused --version

๐Ÿ›ก๏ธ Defensive Safety Architecture #

  1. Multi-Stage Phased Pipeline: --clean-all runs in 9 discrete stages (Commented Files โ†’ Dead Classes โ†’ Dead Blocks โ†’ Internal Classes Privatization โ†’ TODOs โ†’ Unused Imports โ†’ Dead Code โ†’ Unused Assets โ†’ Unused/Duplicate Packages), re-auditing AST and line offsets between stages to maintain surgical precision.
  2. Multi-Pubspec & Monorepo Scoping: Automatically identifies all pubspec.yaml files across root, submodules, and nested packages, scoping imports and assets strictly to each package without leaking dependencies.
  3. Automatic Snapshot Backups: Before any files or pubspec.yaml declarations are touched, an isolated copy is saved to .detect_unused/backups/.
  4. Instant Rollback: If you ever want to revert, run detect_unused --restore <id> or detect_unused --restore-latest to instantly recover files.
  5. Auto-Clean Snapshot on Restore: The restored snapshot folder is automatically removed upon successful recovery to reclaim disk space (override with --keep-backup).
  6. Smart Dart Extension Awareness: Scans declared getters, setters, methods, and static fields in extensions to prevent false-positive flags when extension members are used across files.
  7. Constructor Key Cleanup: Strips redundant super.key and Key? key parameters when privatizing internal widget classes to prevent unused_element_parameter compiler warnings.
  8. Automatic .gitignore Protection: .detect_unused/ is automatically appended to your .gitignore.
  9. Post-Cleanup Health Verification: The tool automatically verifies dart analyze after cleaning. If compiler errors are detected, it prompts to auto-rollback immediately.

CLI Options Reference #

Flag Short Default Description
--path=<dir> / --url=<dir> - . Target directory or file to audit
--packages --audit-packages false Audit unused & duplicate packages across all pubspec.yaml files
--clean-packages - false Safely delete unused & duplicate dependencies from pubspec.yaml
--assets --audit-assets false Audit unused assets, images, and fonts across all packages
--clean-assets - false Safely delete unused media assets and prune explicit pubspec lines
--clean-all --clean false Remediate all safe issues (including assets & packages) with auto-backup & prompt
--clean-commented-files - false Delete 100% commented-out files
--clean-dead-blocks - false Remove dead commented code blocks
--clean-dead-classes - false Remove zero-usage dead classes and widgets
--privatize-internal - false Convert file-internal public classes to _ClassName
--clean-todos --clean-todo false Clean and remove pending // TODO comments
--clean-unused-imports --clean-imports false Remove unused and unnecessary import statements
--clean-dead-code - false Remediate dead null-aware expressions (?. to .)
--dry-run - false Preview cleanup changes without touching disk
--yes -y false Skip interactive confirmation prompt
--no-backup - false Bypass automatic snapshot backup (not recommended)
--interactive -i false Launch interactive terminal dashboard wizard (TUI)
--undo / undo - false Instant single-step rollback of the latest cleanup snapshot
--markdown [file] --report-md false Generate GitHub Flavored Markdown (GFM) summary report for CI/CD
--backups --list-backups false List all available snapshot backups
--clean-backups - false Delete all snapshot archives from disk
--restore <id> - - Restore active project files from backup ID (auto-cleans snapshot)
--restore-latest - false Restore project files from the latest snapshot
--keep-backup - false Retain snapshot archive after successful restoration
--todos-only - false Audit only TODO tasks and pending notes
--diagnostics-only --analyzer-only false Audit only Dart analyzer diagnostics
--unused-classes --classes false Audit only unused/dead classes
--commented --comments false Audit only commented-out files and blocks
--no-todos - false Exclude TODO tasks from full audit
--no-diagnostics - false Exclude Dart analyzer diagnostics from full audit
--no-internal - false Exclude file-internal only public classes
--exclude-generated - true Exclude generated files (*.g.dart, *.freezed.dart, etc.) from audit & cleanup
--include-generated - false Force auditor to include generated files in scan targets
--no-di-guards - false Disable automatic protection for Dependency Injection classes
--exclude <patterns> - - Exclude custom file patterns or globs (e.g. test/mocks/*)
--threshold <int> - 60 Percentage threshold for heavily commented files
--min-lines <int> - 15 Minimum lines to flag a dead block
--json [filename] - false Save analysis report to a .json file (default: detect_unused_code.json)
--verbose -v false Print samples of detected commented blocks
--help -h - Display help message and exit
--version -V - Display package version and exit

Programmatic API #

You can call the auditor directly inside your Dart code or custom CI runner scripts:

import 'package:detect_unused_code/detect_unused_code.dart';

void main() {
  final auditor = UnusedCodeAuditor(
    options: const AuditorOptions(
      targetPath: 'lib',
      includeInternal: true,
      commentThreshold: 70,
      minBlockLines: 15,
    ),
  );

  final report = auditor.run(
    onProgress: (percent, stage) {
      print('$percent% - $stage');
    },
  );

  print('Dead classes: ${report.deadClasses.length}');
  for (final item in report.deadClasses) {
    print('- [${item.category}] ${item.name} (${item.relPath}:${item.line})');
  }

  print('TODO items: ${report.todos.length}');
  for (final item in report.todos) {
    print('- ${item.file}:${item.line} -> ${item.message}');
  }

  print('Unused imports: ${report.unusedImports.length}');
  print('Unused variables: ${report.unusedVariablesAndFields.length}');
}

CI / CD Integration (GitHub Actions) #

Add a step in your workflow to fail the build if dead code is detected:

- name: Audit Dead Code
  run: dart run detect_unused_code

The CLI returns exit code 1 when dead classes, fully commented files, or unused analyzer diagnostics are found, and 0 when the code is clean.


ุฏู„ูŠู„ ุงู„ุงุณุชุฎุฏุงู… ุงู„ุณุฑูŠุน ูˆุฃู‡ู…ูŠุฉ ุงู„ู…ูƒุชุจุฉ (ุจุงู„ู„ุบุฉ ุงู„ุนุฑุจูŠุฉ) #

ู„ู…ุงุฐุง ูŠุญุชุงุฌ ูƒู„ ู…ุดุฑูˆุน Flutter ูˆ Dart ู„ู‡ุฐู‡ ุงู„ู…ูƒุชุจุฉุŸ #

ู…ุญู„ู„ ุฏุงุฑุช ุงู„ุงูุชุฑุงุถูŠ (flutter analyze) ู„ุง ูŠูƒุชุดู ุฃุจุฏุงู‹ ุงู„ูƒู„ุงุณุงุช ูˆุงู„ู€ Widgets ุงู„ุนุงู…ุฉ ุบูŠุฑ ุงู„ู…ุณุชุฎุฏู…ุฉุŒ ู„ุฃู† ุทุจูŠุนุฉ Dart ุชุนุชุจุฑ ุฃูŠ ูƒู„ุงุณ public ู‚ุงุจู„ุงู‹ ู„ู„ุงุณุชูŠุฑุงุฏ ุงู„ุฎุงุฑุฌูŠ.

ููŠ ุงู„ู…ุดุงุฑูŠุน ุงู„ู…ุชูˆุณุทุฉ ูˆุงู„ูƒุจูŠุฑุฉุŒ ุชุชุฑุงูƒู… ุงู„ุฏูŠูˆู† ุงู„ุชู‚ู†ูŠุฉ:

  • ูƒู„ุงุณุงุช ูˆ Widgets ู…ู‡ุฌูˆุฑุฉ: ุดุงุดุงุชุŒ WidgetsุŒ ูˆ Dialogs ู„ู… ุชุนุฏ ู…ุณุชุฎุฏู…ุฉ ููŠ ุฃูŠ ู…ูƒุงู†.
  • ู…ู„ูุงุช ู…ุนุทู„ุฉ ุจุงู„ูƒุงู…ู„ (100% Comments): ู…ู„ูุงุช ุชู… ุชุนู„ูŠู‚ ู…ุญุชูˆุงู‡ุง ุจู€ /* ... */ ูˆุธู„ุช ุชุฒูŠุฏ ู…ู† ุญุฌู… ุงู„ู…ุดุฑูˆุน.
  • ุจู„ูˆูƒุงุช ุจุฑู…ุฌูŠุฉ ู…ุนู„ู‚ุฉ: ูƒุชู„ ูƒูˆุฏ ุชุฒูŠุฏ ุนู† 15 ุณุทุฑ ู…ุนู„ู‚ุฉ ุฏุงุฎู„ ู…ู„ูุงุช ุญูŠุฉ.
  • ู…ู‡ุงู… ู…ุนู„ู‚ุฉ (TODOs): ุงุณุชุฎุฑุงุฌ ุฌู…ูŠุน ุงู„ู€ TODOs ุจุฏู‚ุฉ ู…ุน ุฃุฑู‚ุงู… ุงู„ุฃุณุทุฑ ูˆุงู„ูˆุตู.
  • ุชุดุฎูŠุตุงุช ุงู„ุฑู…ูˆุฒ ุงู„ู…ู‡ู…ู„ุฉ: ุงูƒุชุดุงู ุงู„ุงุณุชูŠุฑุงุฏุงุช ุงู„ุฒุงุฆุฏุฉุŒ ุงู„ู…ุชุบูŠุฑุงุช ุบูŠุฑ ุงู„ู…ุณุชุฎุฏู…ุฉุŒ ุงู„ุฃูƒูˆุงุฏ ุบูŠุฑ ุงู„ู‚ุงุจู„ุฉ ู„ู„ูˆุตูˆู„ุŒ ูˆุงู„ุชุนุจูŠุฑุงุช ุงู„ู…ูŠุชุฉ.

ุชู‚ูˆู… ุงู„ู…ูƒุชุจุฉ ุจูุญุต ุดุงู…ู„ ู„ูƒู„ ู‡ุฐู‡ ุงู„ู†ู‚ุงุท ุงู„ู€ 13 ุฏูุนุฉ ูˆุงุญุฏุฉ ุจุฏูˆู† ุฃูŠ ุญุฒู… ุฎุงุฑุฌูŠุฉ (Zero Dependencies).

ุฃูˆุงู…ุฑ ุณุฑูŠุนุฉ (ุจุงุณุชุฎุฏุงู… ุงู„ุฃู…ุฑ ุงู„ู…ุฎุชุตุฑ detect_unused): #

  • ูุญุต ุดุงู…ู„ ู„ูƒุงูุฉ ุงู„ู†ู‚ุงุท ุงู„ู€ 13:
    detect_unused
    # ุฃูˆ ุนุจุฑ dart run:
    dart run detect_unused_code
    
  • ูุญุต ู…ุฌู„ุฏ ู…ุนูŠู† (ู…ุซู„ lib):
    detect_unused --path="lib"
    
  • ูุญุต ุงู„ู€ TODOs ูู‚ุท:
    detect_unused --todos-only
    
  • ูุญุต ุชุดุฎูŠุตุงุช ุงู„ู…ุญู„ู„ ูู‚ุท (unused imports, variables, dead code):
    detect_unused --diagnostics-only
    
  • ุงุณุชุฎุฑุงุฌ ุงู„ูƒู„ุงุณุงุช ูˆุงู„ู€ Widgets ุงู„ู…ู‡ุฌูˆุฑุฉ ูู‚ุท:
    detect_unused --unused-classes
    
  • ุชุตุฏูŠุฑ ุงู„ุชู‚ุฑูŠุฑ ูƒุงู…ู„ุงู‹ ุฅู„ู‰ ู…ู„ู JSON (ูŠู†ุดุฆ ู…ู„ู detect_unused_code.json ููŠ ู†ูุณ ุงู„ู…ุฌู„ุฏ):
    detect_unused --json
    # ุฃูˆ ุชุญุฏูŠุฏ ุงุณู… ู…ุฎุตุต ู„ู„ู…ู„ู:
    detect_unused --json=report.json
    
  • ูุญุต ูˆุชุฏู‚ูŠู‚ ุงู„ู…ูƒุงุชุจ ูˆุงู„ุชุจุนูŠุงุช ุงู„ุฎุงุฑุฌูŠุฉ ุงู„ู…ู‡ู…ู„ุฉ ูˆุงู„ู…ูƒุฑุฑุฉ ููŠ ู…ู„ูุงุช pubspec.yaml:
    detect_unused --packages
    
  • ูุญุต ูˆุชุฏู‚ูŠู‚ ุงู„ู…ูˆุงุฑุฏ ูˆุงู„ูˆุณุงุฆุท ูˆุงู„ุฎุทูˆุท ุงู„ู…ู‡ู…ู„ุฉ (Assets & Fonts):
    detect_unused --assets
    

๐Ÿ›ก๏ธ ู…ูŠุฒุงุช ุงู„ุฏู‚ุฉ ุงู„ุนุงู„ูŠุฉ ูˆุงู„ุญู…ุงูŠุฉ ุงู„ุฐูƒูŠุฉ (v2.4.0+): #

  • ุงุณุชุซู†ุงุก ุงู„ูƒูˆุฏ ุงู„ู…ูˆู„ุฏ ุชู„ู‚ุงุฆูŠุงู‹ (Generated Code Auto-Exclusion): ูŠุชู… ุงุณุชุซู†ุงุก ูƒุงูุฉ ู…ู„ูุงุช ุงู„ูƒูˆุฏ ุงู„ู…ูˆู„ุฏ (*.g.dartุŒ *.freezed.dartุŒ *.mocks.dartุŒ *.config.dartุŒ ุฅู„ุฎ) ู…ู† ุชู‚ุงุฑูŠุฑ ุงู„ูƒูˆุฏ ุงู„ู…ูŠุช ูˆู…ู† ู…ุญุฑูƒ ุงู„ุชู†ุธูŠูุŒ ู…ุน ุงู„ุญูุงุธ ุนู„ู‰ ู‚ุฑุงุกุฉ ุงู„ู…ุฑุงุฌุน ู…ู†ู‡ุง.
  • ุชูˆุฌูŠู‡ุงุช ุงู„ุงุณุชุซู†ุงุก ุงู„ูŠุฏูˆูŠ (@keepUnused): ูŠู…ูƒู†ูƒ ูƒุชุงุจุฉ // @keepUnused ุฃูˆ @keepUnused ููˆู‚ ุฃูŠ ูƒู„ุงุณ ู„ู…ู†ุน ุงุนุชุจุงุฑู‡ ูƒูˆุฏุงู‹ ู…ูŠุชุงู‹ุŒ ุฃูˆ ูƒุชุงุจุฉ // ignore_for_file: unused_code ููŠ ุจุฏุงูŠุฉ ุงู„ู…ู„ู ู„ุชุฎุทูŠ ุงู„ู…ู„ู ุจุงู„ูƒุงู…ู„.
  • ุฏุฑุน ุฃู†ู…ุงุท ุญู‚ู† ุงู„ุงุนุชู…ุงุฏูŠุงุช (DI Guards): ูŠุชุนุฑู ุงู„ู…ุญู„ู„ ุชู„ู‚ุงุฆูŠุงู‹ ุนู„ู‰ ูƒู„ุงุณุงุช ุงู„ู€ DI ุงู„ู…ูˆุณูˆู…ุฉ ุจู€ @injectableุŒ @singletonุŒ @lazySingletonุŒ @moduleุŒ ูˆูŠุญู…ูŠู‡ุง ู…ู† ุงู„ุญุฐู ุงู„ุฎุงุทุฆ.

๐Ÿงน ุฃูˆุงู…ุฑ ุงู„ุชู†ุธูŠู ุงู„ุชู„ู‚ุงุฆูŠ ูˆุงู„ู†ุณุฎ ุงู„ุงุญุชูŠุงุทูŠ (ุฅุตุฏุงุฑุงุช 2.0+ ุฅู„ู‰ 3.2+): #

  • ุชู†ุธูŠู ุขู…ู† ูˆุดุงู…ู„ ู„ุฌู…ูŠุน ุงู„ู…ุดุงูƒู„ ุงู„ู…ูƒุชุดูุฉ ู…ุน ุฅู†ุดุงุก ู†ุณุฎุฉ ุงุญุชูŠุงุทูŠุฉ ุชู„ู‚ุงุฆูŠุฉ:
    detect_unused --clean-all
    
  • ุชู†ุธูŠู ุงู„ุชุจุนูŠุงุช ูˆุงู„ู…ูƒุงุชุจ ุงู„ู…ู‡ู…ู„ุฉ ูˆุงู„ู…ูƒุฑุฑุฉ ู…ู† ู…ู„ูุงุช pubspec.yaml:
    detect_unused --clean-packages
    
  • ุชู†ุธูŠู ุงู„ู…ูˆุงุฑุฏ ูˆุงู„ุตูˆุฑ ูˆุงู„ุฎุทูˆุท ุงู„ู…ู‡ู…ู„ุฉ ูˆุงุณุชุนุงุฏุฉ ู…ุณุงุญุฉ ุงู„ุชุฎุฒูŠู†:
    detect_unused --clean-assets
    
  • ู…ุนุงูŠู†ุฉ ุฎุทุฉ ุงู„ุชู†ุธูŠู ูู‚ุท ุฏูˆู† ุชุนุฏูŠู„ ุฃูŠ ู…ู„ู ููŠ ุงู„ู‚ุฑุต (ู…ุญุงูƒุงุฉ):
    detect_unused --clean-all --dry-run
    
  • ุชู†ุธูŠู ูุฆุฉ ู…ุนูŠู†ุฉ ุจุดูƒู„ ู…ุณุชู‚ู„:
    # ุญุฐู ุงู„ู…ู„ูุงุช ุงู„ู…ุนู„ู‚ุฉ ุจุงู„ูƒุงู…ู„ (100% comments):
    detect_unused --clean-commented-files
    
    # ุญุฐู ุงู„ูƒุชู„ ุงู„ู…ุนู„ู‚ุฉ ุงู„ูƒุจูŠุฑุฉ ู…ู† ุงู„ู…ู„ูุงุช ุงู„ุญูŠุฉ:
    detect_unused --clean-dead-blocks
    
    # ุญุฐู ุงู„ูƒู„ุงุณุงุช ูˆุงู„ู€ Widgets ุงู„ู…ู‡ุฌูˆุฑุฉ ุบูŠุฑ ุงู„ู…ุณุชุฎุฏู…ุฉ ู†ู‡ุงุฆูŠุงู‹:
    detect_unused --clean-dead-classes
    
    # ุชุญูˆูŠู„ ุงู„ูƒู„ุงุณุงุช ุงู„ุฏุงุฎู„ูŠุฉ ุฅู„ู‰ ูƒู„ุงุณุงุช ุฎุงุตุฉ (_ClassName):
    detect_unused --privatize-internal
    
    # ุชู†ุธูŠู ุฃุณุทุฑ ุงู„ู…ู‡ุงู… ุงู„ู…ุนู„ู‚ุฉ (TODO):
    detect_unused --clean-todos
    
    # ุชู†ุธูŠู ุงู„ุงุณุชูŠุฑุงุฏุงุช ุบูŠุฑ ุงู„ู…ุณุชุฎุฏู…ุฉ ูˆุงู„ู…ูƒุฑุฑุฉ:
    detect_unused --clean-unused-imports
    
    # ุชู†ุธูŠู ุงู„ุฃูƒูˆุงุฏ ุงู„ู…ูŠุชุฉ ูˆุงู„ุชุนุจูŠุฑุงุช ุบูŠุฑ ุงู„ู…ุฌุฏูŠุฉ (ู…ุซู„ ?. ุงู„ุฒุงุฆุฏุฉ):
    detect_unused --clean-dead-code
    
    # ุชู†ุธูŠู ูˆุญุฐู ุงู„ู…ูˆุงุฑุฏ ูˆุงู„ุตูˆุฑ ุงู„ู…ู‡ู…ู„ุฉ ู…ู† ู…ู„ูุงุช pubspec.yaml ูˆุงู„ู‚ุฑุต:
    detect_unused --clean-assets
    
    # ุชู†ุธูŠู ูˆุญุฐู ุงู„ุชุจุนูŠุงุช ูˆุงู„ู…ูƒุงุชุจ ุงู„ู…ู‡ู…ู„ุฉ ูˆุงู„ู…ูƒุฑุฑุฉ ู…ู† ู…ู„ูุงุช pubspec.yaml:
    detect_unused --clean-packages
    
  • ู„ูˆุญุฉ ุงู„ุชุญูƒู… ุงู„ุชูุงุนู„ูŠุฉ ูˆุงู„ุงุณุชุฑุฌุงุน ุงู„ููˆุฑูŠ (v3.2.0):
    • ุฃุดุฑุทุฉ ุชู‚ุฏู… ุญูŠุฉ (Live Progress Bars): ู…ุชุงุจุนุฉ ููˆุฑูŠุฉ ู„ู…ุฑุงุญู„ ูุญุต ุงู„ูƒูˆุฏุŒ ุงู„ุจูƒุฌุงุชุŒ ูˆุงู„ุฃุณูŠุชุณ ููŠ ุงู„ู…ุดุงุฑูŠุน ุงู„ุถุฎู…ุฉ.
    • ุชุญุฏูŠุฏ ู…ูˆุงู‚ุน ุฃุณุทุฑ ุงู„ูƒูˆุฏ ุงู„ู…ูŠุช ุจุฏู‚ุฉ: ุฅุธู‡ุงุฑ ู†ุทุงู‚ ุงู„ุฃุณุทุฑ ุงู„ูุนู„ูŠ ู„ู„ุจู„ูˆูƒุงุช ุงู„ู…ุนู„ู‚ุฉ ููŠ ุชู‚ุฑูŠุฑ ุงู„ุชูุงุตูŠู„ ูˆุงู„ู…ุนุงูŠู†ุฉ (โ†ณ Lines [L152 - L178]).
    • ูุญุต ูˆุชุฃูƒูŠุฏ ุชู„ู‚ุงุฆูŠ ุจุนุฏ ุงู„ุชู†ุธูŠู: ุฅุนุงุฏุฉ ูุญุต ุชู„ู‚ุงุฆูŠุฉ ุจุนุฏ ุงู„ุญุฐู ู„ุนุฑุถ ุชู‚ุฑูŠุฑ ุงู„ุชุฃูƒูŠุฏ ู‚ุจู„ ุงู„ุนูˆุฏุฉ ู„ู„ูˆุญุฉ ุงู„ุชุญูƒู….
    # ุชุดุบูŠู„ ู„ูˆุญุฉ ุงู„ุชุญูƒู… ุงู„ุชูุงุนู„ูŠุฉ (TUI Dashboard) ุชู„ู‚ุงุฆูŠุงู‹ ุจู…ุฌุฑุฏ ูƒุชุงุจุฉ ุงู„ุฃู…ุฑ:
    detect_unused
    # ุฃูˆ ุจุงุณุชุฎุฏุงู… ุงู„ุงุณู… ุงู„ูƒุงู…ู„:
    detect_unused_code
    # ุฃูˆ ุจุงุณุชุฎุฏุงู… ุงู„ุฑุงูŠุฉ ุงู„ุตุฑูŠุญุฉ:
    detect_unused --interactive
    
    # ุฅุฌุฑุงุก ูุญุต ุชุฏู‚ูŠู‚ูŠ ุชู‚ู„ูŠุฏูŠ ููŠ ุงู„ุทุฑููŠุฉ ุจุฏูˆู† ูุชุญ ู„ูˆุญุฉ ุงู„ุชุญูƒู…:
    detect_unused --scan
    
    # ุงู„ุชุฑุงุฌุน ุงู„ููˆุฑูŠ ุจุฎุทูˆุฉ ูˆุงุญุฏุฉ ุนู† ุขุฎุฑ ุนู…ู„ูŠุฉ ุชู†ุธูŠู (Undo):
    detect_unused --undo
    # ุฃูˆ:
    detect_unused undo
    
    # ุงุณุชุฎุฑุงุฌ ุชู‚ุฑูŠุฑ Markdown ู„ูุฑู‚ ุงู„ุนู…ู„ ูˆ CI/CD (GitHub Step Summary):
    detect_unused --markdown
    
  • ุฅุฏุงุฑุฉ ุงู„ู†ุณุฎ ุงู„ุงุญุชูŠุงุทูŠุฉ ูˆุงู„ุงุณุชุฑุฌุงุน ุงู„ููˆุฑูŠ:
    # ุนุฑุถ ู‚ุงุฆู…ุฉ ุงู„ู†ุณุฎ ุงู„ุงุญุชูŠุงุทูŠุฉ ุงู„ู…ุญููˆุธุฉ:
    detect_unused --backups
    
    # ุงุณุชุฑุฌุงุน ุงู„ู…ุดุฑูˆุน ุฅู„ู‰ ุฃุญุฏุซ ู†ุณุฎุฉ ุงุญุชูŠุงุทูŠุฉ:
    detect_unused --restore-latest
    
    # ุงุณุชุฑุฌุงุน ุงู„ู…ุดุฑูˆุน ุฅู„ู‰ ู†ุณุฎุฉ ู…ุญุฏุฏุฉ ุจุฑู‚ู… ุงู„ู€ ID:
    detect_unused --restore 1
    
    # ุงุณุชุฑุฌุงุน ู†ุณุฎุฉ ู…ุน ุงู„ุงุญุชูุงุธ ุจุงู„ุฃุฑุดูŠู ููŠ ุงู„ู‚ุฑุต:
    detect_unused --restore 1 --keep-backup
    
    # ู…ุณุญ ูƒุงูุฉ ุฃุฑุดูŠูุงุช ุงู„ู†ุณุฎ ุงู„ุงุญุชูŠุงุทูŠุฉ ู„ุชูˆููŠุฑ ู…ุณุงุญุฉ ุงู„ู‚ุฑุต:
    detect_unused --clean-backups
    
  • ุนุฑุถ ุฅุตุฏุงุฑ ุงู„ุญุฒู…ุฉ:
    detect_unused --version
    

Frequently Asked Questions (FAQ) #

How do I find and remove unused widgets in Flutter? #

Run detect_unused in your project root. The tool scans all .dart files, builds an AST model of all widget declarations, and flags widgets with 0 cross-file references under ใ€4. Dead Classes / Elementsใ€‘. You can remove them automatically with detect_unused --clean-dead-classes.

Why doesn't standard flutter analyze detect unused public classes? #

Dart treats all public classes (classes without a leading _) as public API surface that could theoretically be consumed by external packages. As a result, the compiler never marks public classes as unused. detect_unused_code solves this by performing full project cross-reference analysis across your workspace.

Can I run detect_unused_code in CI/CD pipelines? #

Yes! Add dart run detect_unused_code to your GitHub Actions or GitLab CI. If dead code or unreferenced classes are found, the CLI returns an exit code of 1, failing the pipeline and keeping your repository clean.

Is the automated cleanup safe? #

Yes. Every cleanup command automatically creates an isolated snapshot in .detect_unused/backups/. You can immediately rollback using detect_unused --restore-latest. Additionally, you can run detect_unused --clean-all --dry-run to preview all proposed modifications before touching your disk.


License #

MIT License. See LICENSE for details.

10
likes
160
points
1.04k
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Fast, zero-dependency Dart & Flutter dead code, assets, and packages remediation engine. Safely cleans unused classes, imports, assets, and dependencies.

Repository (GitHub)
View/report issues
Contributing

Topics

#unused-code #dead-code #flutter #analyzer #code-quality

License

MIT (license)

More

Packages that depend on detect_unused_code