Flutter Quality Lints
A comprehensive, enterprise-grade linting package for Flutter projects that ensures code quality, performance, security, and accessibility compliance.
Features
Core Quality Rules (7 rules)
- avoid_empty_catch_blocks - Prevents silent error swallowing
- avoid_long_methods - Enforces method length limits (default: 50 lines)
- avoid_magic_numbers - Requires constants for hardcoded numbers
- avoid_nested_conditionals - Limits conditional nesting depth
- prefer_early_return - Encourages guard clauses
- prefer_single_widget_per_file - Promotes better organization
- prefer_trailing_commas - Ensures consistent formatting
Flutter Performance Rules (4 rules)
- prefer_slivers_over_columns - Optimizes scrolling performance for long lists
- avoid_widget_rebuilds - Detects unnecessary widget rebuilds
- prefer_stateless_widgets - Suggests StatelessWidget when appropriate
- avoid_build_context_across_async - Prevents common async context errors
Architecture Rules (1 rule)
- enforce_layer_dependencies - Validates clean architecture layer dependencies
Security Rules (1 rule)
- avoid_hardcoded_secrets - Detects API keys, passwords, and other secrets
Advanced CLI Tool
- Comprehensive Analysis - Multi-dimensional code quality assessment
- Performance Profiling - Widget tree optimization and memory leak detection
- Security Scanning - Vulnerability assessment and secret detection
- Accessibility Compliance - WCAG guidelines validation
- Interactive Reports - HTML/JSON/Markdown report generation
Installation
Add this to your package's pubspec.yaml
:
dev_dependencies:
custom_lint: ^0.6.4
flutter_quality_lints: ^0.9.1
Configuration
Basic Setup
Create or update your analysis_options.yaml
:
analyzer:
plugins:
- custom_lint
custom_lint:
rules:
# Recommended preset (10 rules)
- avoid_empty_catch_blocks
- avoid_magic_numbers
- prefer_early_return
- prefer_trailing_commas
- avoid_widget_rebuilds
- prefer_stateless_widgets
- avoid_build_context_across_async
- avoid_hardcoded_secrets
- enforce_layer_dependencies
- prefer_slivers_over_columns
Rule Presets
Choose from predefined rule sets:
// In your custom_lint.yaml or analysis_options.yaml
import 'package:flutter_quality_lints/flutter_quality_lints.dart';
// Available presets:
FlutterQualityLints.basicRules // 5 essential rules
FlutterQualityLints.recommendedRules // 10 production-ready rules
FlutterQualityLints.strictRules // All 13 rules
FlutterQualityLints.performanceRules // 4 performance-focused rules
FlutterQualityLints.securityRules // 1 security rule
Advanced Configuration
flutter_quality_lints:
# Core Rules Configuration
avoid_long_methods:
max_lines: 50
exclude_getters: true
exclude_constructors: true
avoid_magic_numbers:
allowed_numbers: [0, 1, -1, 2, 10, 100, 1000]
ignore_in_tests: true
# Performance Rules Configuration
prefer_slivers_over_columns:
max_children: 10
check_scrollable_nesting: true
avoid_widget_rebuilds:
check_const_usage: true
check_inline_functions: true
# Architecture Rules Configuration
enforce_layer_dependencies:
layers:
presentation: ["lib/presentation/", "lib/ui/", "lib/pages/"]
domain: ["lib/domain/", "lib/entities/", "lib/usecases/"]
data: ["lib/data/", "lib/datasources/", "lib/models/"]
dependency_rules:
presentation: ["domain"] # Can only depend on domain
domain: [] # Pure - no dependencies
data: ["domain"] # Can only depend on domain
# Security Rules Configuration
avoid_hardcoded_secrets:
min_secret_length: 10
ignore_test_files: true
check_patterns:
- api_keys
- jwt_tokens
- oauth_tokens
CLI Tool Usage
The Flutter Quality Lints CLI provides advanced analysis capabilities:
Installation
# Add to pubspec.yaml
dependencies:
flutter_quality_lints: ^0.9.1
# Make CLI executable
chmod +x bin/flutter_quality_lints.dart
Commands
Comprehensive Analysis
dart bin/flutter_quality_lints.dart analyze [target_directory]
# Example output:
# Running Flutter Quality Analysis on: lib
# Analysis Results:
# Files analyzed: 25
# Issues found: 12
# Critical: 2
# Warning: 7
# Info: 3
# Quality Score: 9.5/10.0
Performance Analysis
dart bin/flutter_quality_lints.dart performance [target_directory]
# Features:
# Widget Tree Complexity Analysis
# Memory Leak Detection
# Unnecessary Rebuild Detection
# Performance Score Calculation
Optimization Suggestions
dart bin/flutter_quality_lints.dart optimize [target_directory]
# Provides:
# Widget Optimizations
# State Management Improvements
# Build Context Safety Recommendations
Security Scanning
dart bin/flutter_quality_lints.dart security [target_directory]
# Detects:
# Hardcoded Secrets (API keys, passwords)
# Input Validation Issues
# Insecure Network Connections
Accessibility Compliance
dart bin/flutter_quality_lints.dart accessibility [target_directory]
# Validates:
# WCAG AA Compliance
# Semantic Labels
# Color Contrast Ratios
# Focus Management
Report Generation
dart bin/flutter_quality_lints.dart report [html|json|markdown]
# Generates:
# Comprehensive Quality Reports
# Trend Analysis Charts
# Interactive Navigation
# Export to PDF (HTML format)
Auto-Fix Engine
# Preview fixes without applying them
dart bin/flutter_quality_lints.dart fix [target_directory] --dry-run
# Apply automatic fixes
dart bin/flutter_quality_lints.dart fix [target_directory]
# Auto-fixes include:
# - Add const to widget constructors
# - Add trailing commas
# - Convert to StatelessWidget
# - Add mounted checks after async
# - Simplify nested conditionals
# - Extract magic numbers to constants
Rule Details
Core Quality Rules
avoid_magic_numbers
// Bad
Container(width: 250, height: 150);
// Good
class Constants {
static const double cardWidth = 250;
static const double cardHeight = 150;
}
Container(width: Constants.cardWidth, height: Constants.cardHeight);
prefer_early_return
// Bad
String processUser(User? user) {
if (user != null) {
if (user.isActive) {
return user.name;
} else {
return 'Inactive user';
}
} else {
return 'No user';
}
}
// Good
String processUser(User? user) {
if (user == null) return 'No user';
if (!user.isActive) return 'Inactive user';
return user.name;
}
Performance Rules
prefer_slivers_over_columns
// Bad - Performance issue with many children
Column(
children: List.generate(1000, (index) => Text('Item $index')),
)
// Good - Efficient scrolling
CustomScrollView(
slivers: [
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) => Text('Item $index'),
childCount: 1000,
),
),
],
)
avoid_build_context_across_async
// Bad - Context used after async operation
Future<void> deleteItem() async {
await apiService.deleteItem();
Navigator.of(context).pop(); // Dangerous!
}
// Good - Check if mounted
Future<void> deleteItem() async {
await apiService.deleteItem();
if (mounted) {
Navigator.of(context).pop();
}
}
Security Rules
avoid_hardcoded_secrets
// Bad
const String apiKey = 'sk_live_abcd1234567890';
// Good
final String apiKey = Platform.environment['API_KEY'] ?? '';
Architecture Rules
enforce_layer_dependencies
// Bad - Presentation layer importing data layer
import '../data/user_repository_impl.dart'; // In presentation layer
// Good - Presentation layer importing domain layer
import '../domain/repositories/user_repository.dart'; // In presentation layer
Quality Metrics
The package provides comprehensive quality scoring:
- Quality Score: Overall code health (0-10.0)
- Performance Score: Widget and rendering efficiency
- Security Score: Vulnerability assessment
- Accessibility Score: WCAG compliance level
Scoring Algorithm
Quality Score = 10.0 - (Critical Issues × 2.0 + Warnings × 1.0 + Info × 0.5) / Files Analyzed
Integration Examples
CI/CD Integration
# .github/workflows/quality_check.yml
- name: Run Quality Analysis
run: |
dart bin/flutter_quality_lints.dart analyze lib
dart bin/flutter_quality_lints.dart security lib
dart bin/flutter_quality_lints.dart report json > quality_report.json
VS Code Integration
{
"dart.customLintRules": ["flutter_quality_lints"],
"dart.showIgnoreQuickFixes": true
}
Pre-commit Hook
#!/bin/sh
dart bin/flutter_quality_lints.dart analyze lib
if [ $? -ne 0 ]; then
echo "Quality check failed. Please fix issues before committing."
exit 1
fi
Advanced Features
Native Analysis Options Integration
Full integration with Dart's built-in analyzer for comprehensive coverage.
Auto-fix Engine
Many rules support automatic fixes for common patterns.
Performance Profiling
Deep analysis of widget trees and rebuild patterns.
Security Scanning
Enterprise-grade secret detection with pattern matching.
Accessibility Validation
WCAG 2.1 AA compliance checking with actionable recommendations.
Contributing
We welcome contributions! Please see our Contributing Guide for details.
Development Setup
git clone https://github.com/dvillegastech/flutter_quality_lints.git
cd flutter_quality_lints
dart pub get
dart test
License
This project is licensed under the MIT License - see the LICENSE file for details.
Links
Made with by David Villegas