detect_unused_code 3.3.0
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 #
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:
- Unused & Dead Classes: Declared classes, widgets, mixins, enums, extensions, and controllers that have 0 references across the entire workspace.
- File-Internal Only Public Classes: Public classes that are only used inside their declaring file (candidates to become private
_or to be deleted). - Fully Commented-Out Files: Files where 90%+ of the content is commented-out code (extracts the commented class names).
- Heavily Commented Files: Active files exceeding a configurable comment percentage threshold (default: 60%).
- Large Dead Code Blocks: Abandoned multi-line code blocks commented out inside active files (default: 15+ consecutive lines).
- TODO Comments & Pending Tasks: Tracks pending
// TODO: ...and/* TODO ... */tasks with exact line numbers and descriptions. - Unused Imports (
unused_import): Imports declared in a file that are never referenced. - Unnecessary Imports (
unnecessary_import): Redundant or duplicated imports. - Unused Local Variables (
unused_local_variable): Local variables initialized but never read. - Unused Fields (
unused_field): Private/internal class fields that are never accessed. - Unused Elements (
unused_element): Private functions, methods, or declarations that have zero calls. - Dead Code (
dead_code): Unreachable code blocks (e.g. following a return or break statement). - 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, andMedia Assetsso 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 #
- Multi-Stage Phased Pipeline:
--clean-allruns 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. - Multi-Pubspec & Monorepo Scoping: Automatically identifies all
pubspec.yamlfiles across root, submodules, and nested packages, scoping imports and assets strictly to each package without leaking dependencies. - Automatic Snapshot Backups: Before any files or
pubspec.yamldeclarations are touched, an isolated copy is saved to.detect_unused/backups/. - Instant Rollback: If you ever want to revert, run
detect_unused --restore <id>ordetect_unused --restore-latestto instantly recover files. - Auto-Clean Snapshot on Restore: The restored snapshot folder is automatically removed upon successful recovery to reclaim disk space (override with
--keep-backup). - 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.
- Constructor Key Cleanup: Strips redundant
super.keyandKey? keyparameters when privatizing internal widget classes to preventunused_element_parametercompiler warnings. - Automatic
.gitignoreProtection:.detect_unused/is automatically appended to your.gitignore. - Post-Cleanup Health Verification: The tool automatically verifies
dart analyzeafter 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.