Package selection guidance compiled from public package information, community data, and project usage.
A Flutter package that provides a customizable step progress bar, visually representing progress through a series of steps. Each step can be marked as selected or unselected, making it ideal for guiding users through multi-stage processes like forms, onboarding flows, or checkouts. The indicator supports smooth animations and is highly configurable with options for colors, sizes, and step spacing. It works across all major platforms including Android, iOS, Web, macOS, Windows, and Linux.
Use cases
Onboarding wizards
Multi-step forms
Checkout process tracking
Task completion workflows
Tutorial progress indicators
Key features
Customizable step appearance
Animated transitions between steps
Support for multiple platforms
Configurable colors and sizes
Responsive design
Easy integration with existing UI
Suitable for
App developers building guided user journeys
Designers needing visual progress feedback
Projects requiring cross-platform consistency
UX-focused applications with sequential tasks
Simple yet elegant progress visualization
Considerations
Limited to linear step progression
No built-in support for dynamic step addition/removal
Requires manual state management for step updates
Not suitable for non-linear workflows
May need additional styling for complex themes
Original README
Original README snapshot from the linked source repository. Visit the repository for the latest content.
Step Progress Indicator
Open source Flutter package, bar indicator made of a series of selected and unselected steps.
Made by Sandro Maglione, check out his personal official website sandromaglione.com
Number of steps to underline, all the steps with index <= currentStep will have Color equal to selectedColor.
0
customStep(int, Color, double)
Widget
Defines a custom Widget to display at each step, given the current step index, the Color, which could be defined with selectedColor and unselectedColor or using customColor, and its size, which could be defined using size, selectedSize, unselectedSize, or customSize.
-
onTap(int)
void Function()
Defines onTap function given index of the pressed step.
-
customColor(int)
Color
Assign a custom Color for each step.
-
customSize(int)
double
Assign a custom size for each step.
-
selectedColor
Color
Color of the selected steps.
Colors.blue
unselectedColor
Color
Color of the unselected steps.
Colors.grey
gradientColor
Gradient
Apply gradient color to the indicator.
-
selectedGradientColor
Gradient
Apply gradient color to the selected steps of the indicator.
-
unselectedGradientColor
Gradient
Apply gradient color to the unselected steps of the indicator.
-
blendMode
BlendMode
Apply BlendMode to ShaderMask when gradientColor, selectedGradientColor, or unselectedGradientColor defined.
-
direction
Axis
Defines if indicator is horizontal or vertical.
Axis.horizontal
progressDirection
TextDirection
Defines if steps grow from left-to-right / top-to-bottom TextDirection.ltr or right-to-left / bottom-to-top TextDirection.rtl.
TextDirection.ltr
size
double
Size of the indicator (height if direction is Axis.horizontal, width if Axis.vertical).
4.0
padding
double
Spacing, left-right if horizontal, top-bottom if vertical, of each step.
2.0
fallbackLength
double
Length of the progress indicator in case the main axis (based on direction attribute) has no size limit i.e. double.infinity.
100.0
selectedSize
double
Specify a custom size for selected steps.
-
unselectedSize
double
Specify a custom size for unselected steps.
-
roundedEdges
Radius
Add rounded edge corners to first and last step.
-
mainAxisAlignment
MainAxisAlignment
Assign alignment MainAxisAlignment for indicator's container.
MainAxisAlignment.center
crossAxisAlignment
CrossAxisAlignment
Assign alignment CrossAxisAlignment for indicator's container.
CrossAxisAlignment.center
stepMainAxisAlignment
MainAxisAlignment
Assign alignment MainAxisAlignment for a single step.
MainAxisAlignment.center
stepCrossAxisAlignment
CrossAxisAlignment
Assign alignment CrossAxisAlignment for a single step.
CrossAxisAlignment.center
CircularStepProgressIndicator Parameters
Parameter
Type
Description
Default
totalSteps
int
Total number of step of the complete indicator.
@required
currentStep
int
Number of steps to underline, all the steps with index <= currentStep will have Color equal to selectedColor.
0
child
Widget
Widget child contained inside the indicator.
-
selectedColor
Color
Color of the selected steps.
Colors.blue
unselectedColor
Color
Color of the unselected steps.
Colors.grey
customColor(int)
Color
Assign a custom Color for each step.
-
gradientColor
Gradient
Apply a gradient color to the indicator.
-
customStepSize(int, bool)
double
Assign a custom size for each step.
-
selectedStepSize
double
Specify a custom size for selected steps.
-
unselectedStepSize
double
Specify a custom size for unselected steps.
-
circularDirection
CircularDirection
Defines if steps grow clockwise (CircularDirection.clockwise) or counterclockwise (CircularDirection.counterclockwise)
CircularDirection.clockwise
stepSize
double
Size of the each step of the indicator.
6.0
height
double
Height of the indicator's container.
-
width
double
Width of the indicator's container.
-
padding
double
Spacing between each step.
math.pi / 20
startingAngle
double
Angle in which is placed the starting point of the indicator.
0
roundedCap(int, bool)
bool
Adds rounded edges at the beginning and at the end of the circular indicator given int index of each step and a bool telling if the step is selected.
(_, __) => false
removeRoundedCapExtraAngle
bool
Removes extra angle caused by StrokeCap.butt when roundedCap is applied #20.
false
arcSize
double
Angle in radiants which represents the size of the arc used to display the indicator.
math.pi * 2
fallbackHeight
double
Height of the indicator's container in case the parent height has no size limit i.e. double.infinity.
100.0
fallbackWidth
double
Width of the indicator's container in case the parent width has no size limit i.e. double.infinity.
100.0
Roadmap
I am always open for suggestions and ideas for possible improvements or fixes.
Feel free to open a Pull Request if you would like to contribute to the project.
If you would like to have a new feature implemented, just write a new issue.
Versioning
v1.0.2 - 2 January 2022
v1.0.1 - 16 June 2021
v1.0.0 - 10 May 2021
v0.2.5+8 - 01 December 2020
v0.2.4+7 - 25 August 2020
v0.2.3+6 - 20 May 2020
v0.2.2+5 - 26 April 2020
v0.2.1+4 - 25 February 2020
v0.2.0+3 - 24 February 2020
v0.1.1+2 - 24 January 2020
v0.1.0+1 - 23 January 2020
Support
If you would like to support my work, why don't you buy me a coffee?