flutter_quality_lints 0.9.1
flutter_quality_lints: ^0.9.1 copied to clipboard
A comprehensive linting package for Flutter projects with performance, security, architecture, and accessibility rules plus advanced CLI analysis tools.
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