voo_circular_progress 0.0.1  voo_circular_progress: ^0.0.1 copied to clipboard
voo_circular_progress: ^0.0.1 copied to clipboard
A highly customizable multi-ring circular progress indicator widget with smooth animations, similar to Google Fit
VooCircularProgress #
A highly customizable multi-ring circular progress indicator widget for Flutter, inspired by fitness tracking apps like Google Fit.
Features #
- Multiple Concentric Rings: Display multiple progress indicators in a single circular widget
- Smooth Animations: Beautiful, customizable animations when progress values change
- Highly Customizable: Control colors, stroke widths, sizes, gaps, and more
- Efficient Rendering: Uses CustomPainterfor optimal performance
- Flexible Center Widget: Place any widget in the center of the rings
- Developer-Friendly API: Clean, intuitive API with great IDE support
- Type-Safe: Built with null safety and strong typing
Installation #
Add this to your package's pubspec.yaml file:
dependencies:
  voo_circular_progress: ^0.0.1
Then run:
flutter pub get
Basic Usage #
import 'package:voo_circular_progress/voo_circular_progress.dart';
VooCircularProgress(
  rings: [
    ProgressRing(
      current: 7762,
      goal: 10000,
      color: Colors.cyan,
      strokeWidth: 12,
    ),
    ProgressRing(
      current: 23,
      goal: 30,
      color: Colors.blue,
      strokeWidth: 12,
    ),
  ],
  size: 200,
  centerWidget: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
      Text('23', style: TextStyle(fontSize: 48)),
      Text('7,762', style: TextStyle(fontSize: 24)),
    ],
  ),
)
Examples #
Single Ring #
VooCircularProgress(
  rings: [
    ProgressRing(
      current: 75,
      goal: 100,
      color: Colors.green,
      strokeWidth: 10,
    ),
  ],
  size: 150,
  centerWidget: Text(
    '75%',
    style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
  ),
)
Multiple Rings #
VooCircularProgress(
  rings: [
    ProgressRing(
      current: 8500,
      goal: 10000,
      color: Colors.green,
      strokeWidth: 12,
    ),
    ProgressRing(
      current: 45,
      goal: 60,
      color: Colors.orange,
      strokeWidth: 12,
    ),
    ProgressRing(
      current: 25,
      goal: 30,
      color: Colors.red,
      strokeWidth: 12,
    ),
  ],
  size: 220,
  gapBetweenRings: 8,
  centerWidget: Icon(Icons.favorite, size: 48, color: Colors.red),
)
Custom Animation #
VooCircularProgress(
  rings: [
    ProgressRing(
      current: progress,
      goal: 100,
      color: Colors.purple,
    ),
  ],
  animationDuration: Duration(milliseconds: 1500),
  animationCurve: Curves.elasticOut,
  centerWidget: Text('${progress.toInt()}%'),
)
Custom Background Color #
VooCircularProgress(
  rings: [
    ProgressRing(
      current: 60,
      goal: 100,
      color: Colors.blue,
      backgroundColor: Colors.grey.withOpacity(0.3),
      strokeWidth: 10,
    ),
  ],
)
API Reference #
VooCircularProgress #
The main widget for displaying circular progress indicators.
Properties
| Property | Type | Default | Description | 
|---|---|---|---|
| rings | List<ProgressRing> | required | List of progress rings to display (outer to inner) | 
| size | double | 200.0 | Overall diameter of the circular progress indicator | 
| gapBetweenRings | double | 8.0 | Spacing between concentric rings | 
| animationDuration | Duration | Duration(milliseconds: 1000) | Duration for progress animations | 
| animationCurve | Curve | Curves.easeInOutCubic | Easing curve for animations | 
| centerWidget | Widget? | null | Optional widget to display in the center | 
ProgressRing #
Represents a single progress ring.
Properties
| Property | Type | Default | Description | 
|---|---|---|---|
| current | double | required | Current progress value | 
| goal | double | required | Target or maximum value | 
| color | Color | required | Color of the progress ring | 
| strokeWidth | double | 12.0 | Thickness of the ring | 
| backgroundColor | Color? | null | Background ring color (defaults to semi-transparent color) | 
| startAngle | double | -π/2 | Starting angle in radians (default is top) | 
| capStyle | StrokeCap | StrokeCap.round | Style of the stroke ends | 
Computed Properties
- progress: Returns progress as a ratio (0.0 to 1.0)
- percentageInt: Returns progress as a percentage (0 to 100)
- isGoalReached: Returns true if current >= goal
CircularProgressConfig #
Configuration object for animation settings.
Properties
| Property | Type | Default | Description | 
|---|---|---|---|
| size | double | 200.0 | Overall size of the indicator | 
| gapBetweenRings | double | 8.0 | Gap between rings | 
| animationDuration | Duration | Duration(milliseconds: 1000) | Animation duration | 
| animationCurve | Curve | Curves.easeInOutCubic | Animation curve | 
Architecture #
This package follows clean architecture principles:
- Domain Layer: ProgressRingandCircularProgressConfigentities
- Presentation Layer:
- Atoms: CircularRingPainter(CustomPainter for efficient rendering)
- Molecules: AnimatedProgressRing(handles animation state)
- Organisms: VooCircularProgress(main widget)
 
- Atoms: 
Performance #
- Uses CustomPainterfor efficient rendering
- Animations are optimized with AnimationController
- Minimal rebuilds through proper state management
- Suitable for displaying multiple rings without performance issues
Contributing #
Contributions are welcome! Please read the contributing guidelines before submitting PRs.
License #
This project is licensed under the MIT License - see the LICENSE file for details.
Credits #
Part of the VooFlutter ecosystem - a comprehensive Flutter development toolkit.