๐Ÿ“˜ multi_nested_circular_progress

Preview Animation

A simple, elegant Flutter package for displaying multiple animated nested circular progress rings, perfect for dashboards, analytics, fitness stats, achievements, level progress, and more.

โœจ Features

  • ๐ŸŽจ Multiple customizable concentric progress rings
  • ๐Ÿ”„ Smooth animation from 0 โ†’ progress
  • โšก Auto-animates again when values change
  • ๐Ÿงฉ Custom center widget (text, icons, images)
  • ๐Ÿ“ Adjustable stroke width and ring spacing
  • ๐Ÿงต Stateless implementation using TweenAnimationBuilder
  • ๐Ÿ“ฆ Lightweight โ€” zero dependencies
  • โœ” Flutter Web, iOS, Android, and Desktop support

๐Ÿš€ Getting Started

Add the dependency to your appโ€™s pubspec.yaml:

dependencies:
  multi_nested_circular_progress: ^1.0.0

๐Ÿ“ฆ Basic Usage

MultiNestedCircularProgress(
  size: 180,
  strokeWidth: 12,
  progresses: [0.8, 0.55, 0.30],
  colors: [
    Colors.amber,
    Colors.pinkAccent,
    Colors.purple,
  ],
  child: Text(
    "80%",
    style: TextStyle(
      fontSize: 26,
      fontWeight: FontWeight.bold,
    ),
  ),
);

๐Ÿงช Example (from the /example app)

class StatsExample extends StatelessWidget {
  const StatsExample({super.key});

  @override
  Widget build(BuildContext context) {
    final adjustedPlays = 0.75;
    final average = 65;
    final best = 88;

    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        const Padding(
          padding: EdgeInsets.all(16.0),
          child: Text(
            "Overview",
            style: TextStyle(
              fontSize: 22,
              fontWeight: FontWeight.w700,
            ),
          ),
        ),

        Row(
          children: [
            const SizedBox(width: 16),
            MultiNestedCircularProgress(
              size: 200,
              strokeWidth: 12,
              progresses: [
                adjustedPlays,
                average / 100,
                best / 100,
              ],
              colors: [
                Colors.amber,
                Colors.pinkAccent,
                Colors.purple,
              ],
              child: Text(
                "${(adjustedPlays * 100).toInt()}%",
                style: const TextStyle(
                  fontSize: 24,
                  fontWeight: FontWeight.w700,
                ),
              ),
            ),
          ],
        ),

        const SizedBox(height: 20),
      ],
    );
  }
}

โš™๏ธ API Reference

MultiNestedCircularProgress

Parameter Type Description
size double Diameter of the entire widget
progresses List<double> Progress values (0.0 โ†’ 1.0) for each ring
colors List<Color> Color for each ring (same length as progresses)
strokeWidth double Thickness of each ring
gap double Space between rings
child Widget? Widget displayed in the center
durationInMilliSeconds int Animation duration in ms (default: 800ms)

๐ŸŽจ Customization Examples

Change ring spacing

gap: 20,

Slow down the animation

durationInMilliSeconds: 1500,

Replace center text with an icon

child: Icon(Icons.star, size: 36, color: Colors.amber),

Show only one ring

progresses: [0.9],
colors: [Colors.green],

๐Ÿงฉ Why Nested Rings?

This widget is ideal for:

  • Game stats
  • Skill/XP progress
  • Fitness level / daily goals
  • Productivity tracking
  • Achievements overview
  • Dashboard KPIs

Preview

Nested Progress Preview

๐Ÿค Contributing

Contributions are welcome! Please open a pull request to the main branch.

๐Ÿชช License

multi_nested_circular_progress is MIT-licensed. See the LICENCE file for details.

โญ๏ธ Support the Package

If you find this widget useful, please give it a โญ on GitHub!