documentation
or in a dedicated video in the Flutter

YouTube channel.

For now, the AnimatedContainer child is just a SizedBox because we will come back at it in another step.

You might wonder why you need a ShapeDecoration
widget for a transparent circle, given that it’s invisible.
The purpose of the invisible circle is to orchestrate
the desired animation. The AnimatedContainer begins with a rounded 
rectangle. When the DownloadStatus changes to fetchingDownload,
the AnimatedContainer needs to animate from a rounded rectangle
to a circle, and then fade out as the animation takes place.
The only way to implement this animation is to define both
the beginning shape of a rounded rectangle and the 
ending shape of a circle. But, you don’t want the final
circle to be visible, so you make it transparent,
which causes an animated fade-out.

Display the button text

The DownloadButton displays GET during the
notDownloaded phase, OPEN during the downloaded
phase, and no text in between.