CircularProgressIndicator class

A Material Design circular progress indicator, which spins to indicate that the application is busy.

A widget that shows progress along a circle. There are two kinds of circular progress indicators:

  • Determinate. Determinate progress indicators have a specific value at each point in time, and the value should increase monotonically from 0.0 to 1.0, at which time the indicator is complete. To create a determinate progress indicator, use a non-null value between 0.0 and 1.0.
  • Indeterminate. Indeterminate progress indicators do not have a specific value at each point in time and instead indicate that progress is being made without indicating how much progress remains. To create an indeterminate progress indicator, use a null value.

The indicator arc is displayed with valueColor, an animated value. To specify a constant color use: AlwaysStoppedAnimation<Color>(color).

This example showcases determinate and indeterminate CircularProgressIndicators. The CircularProgressIndicators will use the updated Material 3 Design appearance when setting the CircularProgressIndicator.year2023 flag to false.
link

To create a local project with this code sample, run:
flutter create --sample=material.CircularProgressIndicator.1 mysample

This sample shows the creation of a CircularProgressIndicator with a changing value. When toggling the switch, CircularProgressIndicator uses a determinate value. As described in: https://m3.material.io/components/progress-indicators/overview
link

To create a local project with this code sample, run:
flutter create --sample=material.CircularProgressIndicator.2 mysample

Animation synchronization

When multiple CircularProgressIndicators or LinearProgressIndicators are animating on screen simultaneously (e.g., in a list of loading items), their uncoordinated animations can appear visually cluttered. To address this, the animation of an indicator can be driven by a custom AnimationController.

This allows multiple indicators to be synchronized to a single animation source. The most convenient way to achieve this for a group of indicators is by providing a controller via ProgressIndicatorTheme (see ProgressIndicatorThemeData.controller). All CircularProgressIndicators or LinearProgressIndicators within that theme's subtree will then share the same animation, resulting in a more coordinated and visually pleasing effect.

Alternatively, a specific AnimationController can be passed directly to the controller property of an individual indicator.

This sample demonstrates how to synchronize the indeterminate animations of multiple CircularProgressIndicators using a Theme.

Tapping the buttons adds or removes indicators. By default, they all share a ProgressIndicatorThemeData.controller, which keeps their animations in sync.

Tapping the "Toggle" button sets the theme's controller to null. This forces each indicator to create its own internal controller, causing their animations to become desynchronized.

link

To create a local project with this code sample, run:
flutter create --sample=material.CircularProgressIndicator.3 mysample

See also:

Inheritance
Implementers

Constructors

CircularProgressIndicator({Key? key, double? value, Color? backgroundColor, Color? color, Animation<Color?>? valueColor, double? strokeWidth, double? strokeAlign, String? semanticsLabel, String? semanticsValue, StrokeCap? strokeCap, BoxConstraints? constraints, double? trackGap, @Deprecated('Set this flag to false to opt into the 2024 progress indicator appearance. Defaults to true. ' 'In the future, this flag will default to false. Use ProgressIndicatorThemeData to customize individual properties. ' 'This feature was deprecated after v3.27.0-0.1.pre.') bool? year2023, EdgeInsetsGeometry? padding, AnimationController? controller})
Creates a circular progress indicator.
const
CircularProgressIndicator.adaptive({Key? key, double? value, Color? backgroundColor, Animation<Color?>? valueColor, double? strokeWidth, String? semanticsLabel, String? semanticsValue, StrokeCap? strokeCap, double? strokeAlign, BoxConstraints? constraints, double? trackGap, @Deprecated('Set this flag to false to opt into the 2024 progress indicator appearance. Defaults to true. ' 'In the future, this flag will default to false. Use ProgressIndicatorThemeData to customize individual properties. ' 'This feature was deprecated after v3.27.0-0.2.pre.') bool? year2023, EdgeInsetsGeometry? padding, AnimationController? controller})
Creates an adaptive progress indicator that is a CupertinoActivityIndicator on TargetPlatform.iOS & TargetPlatform.macOS and a CircularProgressIndicator in material theme/non-Apple platforms.
const

Properties

backgroundColor Color?
Color of the circular track being filled by the circular indicator.
no setteroverride
color Color?
The progress indicator's color.
finalinherited
constraints BoxConstraints?
Defines minimum and maximum sizes for a CircularProgressIndicator.
final
controller AnimationController?
An optional AnimationController that controls the animation of this indeterminate progress indicator.
final
hashCode int
The hash code for this object.
no setterinherited
key Key?
Controls how one widget replaces another widget in the tree.
finalinherited
padding EdgeInsetsGeometry?
The padding around the indicator track.
final
runtimeType Type
A representation of the runtime type of the object.
no setterinherited
semanticsLabel String?
The SemanticsProperties.label for this progress indicator.
finalinherited
semanticsValue String?
The SemanticsProperties.value for this progress indicator.
finalinherited
strokeAlign double?
The relative position of the stroke on a CircularProgressIndicator.
final
strokeCap StrokeCap?
The progress indicator's line ending.
final
strokeWidth double?
The width of the line used to draw the circle.
final
trackGap double?
The gap between the active indicator and the background track.
final
value double?
If non-null, the value of this progress indicator.
finalinherited
valueColor Animation<Color?>?
The progress indicator's color as an animated value.
finalinherited
year2023 bool?
When true, the CircularProgressIndicator will use the 2023 Material Design 3 appearance.
final

Methods

createElement() StatefulElement
Creates a StatefulElement to manage this widget's location in the tree.
inherited
createState() State<CircularProgressIndicator>
Creates the mutable state for this widget at a given location in the tree.
override
debugDescribeChildren() List<DiagnosticsNode>
Returns a list of DiagnosticsNode objects describing this node's children.
inherited
debugFillProperties(DiagnosticPropertiesBuilder properties) → void
Add additional properties associated with the node.
inherited
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) DiagnosticsNode
Returns a debug representation of the object that is used by debugging tools and by DiagnosticsNode.toStringDeep.
inherited
toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) String
A string representation of this object.
inherited
toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug, int wrapWidth = 65}) String
Returns a string representation of this node and its descendants.
inherited
toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) String
Returns a one-line detailed description of the object.
inherited
toStringShort() String
A short, textual description of this widget.
inherited

Operators

operator ==(Object other) bool
The equality operator.
inherited

Constants

defaultAnimationDuration → const Duration
The default duration for one full cycle of the indeterminate animation.
strokeAlignCenter → const double
The indicator stroke is drawn on the center of the indicator path, with half of the strokeWidth on the inside, and the other half on the outside of the path.
strokeAlignInside → const double
The indicator stroke is drawn fully inside of the indicator path.
strokeAlignOutside → const double
The indicator stroke is drawn on the outside of the indicator path.