Build a Download Progress Bar in Flutter with Custom Paint and Animation
How to Show Download Progress in a Flutter App
A download progress indicator is a widget that shows how much of a file has been downloaded from a server. It is useful for providing feedback to the user and preventing them from thinking that your app is broken or frozen. In this article, you will learn how to show download progress in a Flutter app using different types of progress indicators.
Flutter comes with two built-in progress indicator widgets: CircularProgressIndicator and LinearProgressIndicator. They are both part of the material library and follow the Material Design guidelines. You can also use a third-party package called percent_indicator that offers more customization options and features.
download progress bar flutter
How to Use CircularProgressIndicator
A CircularProgressIndicator is a widget that shows progress along a circle. It can be either determinate or indeterminate, depending on whether you provide a value between 0.0 and 1.0 or not. A determinate progress indicator shows the actual percentage of completion, while an indeterminate one shows that something is happening without indicating how much is left.
In this section, you will learn how to use a CircularProgressIndicator to show the download progress of a file. You will need to do the following steps:
Add a progress indicator to your UI layout
Add a button to start downloading a file
Implement the download logic using Dio package
Update the progress value using ValueNotifier
Add a progress indicator to your UI layout
The first step is to add a CircularProgressIndicator widget to your UI layout. You can use a SizedBox widget to specify the size of the indicator, and a ValueListenableBuilder widget to update it based on the value of a ValueNotifier. Here is an example:
child: SizedBox( width: 100, height: 100, child: ValueListenableBuilder( valueListenable: manager.progressNotifier, builder: (context, percent, child) return CircularProgressIndicator( strokeWidth: 20, value: percent, // This parameter is what makes it a determinate progress indicator, // that is, it's what makes the indicator show the portion that's completed. // Without it (or when null), it becomes an indeterminate progress indicator // and just keeps spinning forever. // The value should be a double between 0.0 and 1.0. // If it goes above 1.0 then it will just show a full circle like null does. ); , ), ),
The value parameter is what makes it a determinate progress indicator, that is, it's what makes the indicator show the portion that's completed. Without it (or when null), it becomes an indeterminate progress indicator and just keeps spinning forever. The value should be a double between 0.0 and 1.0. If it goes above 1.0 then it will just show a full circle like null does.
Notice that I am getting the download progress from manager.progressNotifier. I'm using a custom class called DownloadManager that handles the download logic and notifies the UI about the progress. I will explain how to implement this class later.
Add a button to start downloading a file
The next step is to add a button to start downloading a file. You can use a FloatingActionButton widget and attach an onPressed callback to it. Here is an example:
How to show download progress in a Flutter app
Create a download button with CircularProgressIndicator in Flutter
LinearProgressIndicator class - material library - Dart API
Flutter download file with progress bar example
How to use Dio to download files with progress in Flutter
Flutter custom progress indicator widget tutorial
How to create a circular progress bar with percentage in Flutter
Download large files in chunks with pause and resume in Flutter
How to make a determinate and indeterminate progress indicator in Flutter
Flutter download manager with progress indicator and resume support
How to implement a file downloader with a progress bar using Flutter and Firebase
How to create a beautiful download animation in Flutter
How to use flutter_downloader plugin to download files in Flutter
How to show a snackbar with a progress indicator in Flutter
How to create a horizontal progress bar with custom colors in Flutter
How to use StreamBuilder to update the progress of a download task in Flutter
How to create a radial progress bar with gradient colors in Flutter
How to download multiple files concurrently with progress in Flutter
How to use flutter_progress_dialog package to show a progress dialog in Flutter
How to create a custom shaped progress bar in Flutter
How to use flutter_easyloading package to show loading and progress indicators in Flutter
How to create a countdown timer with a progress bar in Flutter
How to use flutter_progress_button package to create animated buttons with progress indicators in Flutter
How to create a liquid progress indicator in Flutter
How to use flutter_file_manager package to manage downloaded files in Flutter
How to create a step progress indicator in Flutter
How to use flutter_spinkit package to show animated loading indicators in Flutter
How to create a wave progress indicator in Flutter
How to use flutter_downloader_ui package to show a download list with progress indicators in Flutter
How to create a heart beat animation with a progress bar in Flutter
How to use http package to download files with headers and parameters in Flutter
How to create a circular slider with a progress bar in Flutter
How to use flutter_progress_hud package to show a HUD with loading and progress indicators in Flutter
How to create a flip card animation with a progress bar in Flutter
How to use workmanager package to run background download tasks in Flutter
How to create a percentage circle with a progress bar in Flutter
How to use flutter_styled_toast package to show toast messages with progress indicators in Flutter
How to create a curved progress bar in Flutter
How to use flutter_archive package to zip and unzip downloaded files in Flutter
How to create a bouncing ball animation with a progress bar in Flutter
How to use dio_http_cache package to cache downloaded files in Flutter
How to create a snake game with a progress bar in Flutter
How to use flutter_statusbarcolor package to change the status bar color according to the progress value in Flutter
How to create a rotating cube animation with a progress bar in Flutter
How to use path_provider package to get the directory for saving downloaded files in Flutter
How to create a battery level indicator with a progress bar in Flutter
How to use permission_handler package to request storage permission for downloading files in Flutter
How to create a music player UI with a progress bar in Flutter
How to use flutter_local_notifications package to show notifications for download status in Flutter
floatingActionButton: FloatingActionButton( child: Icon(Icons.download), onPressed: () // Call the download method of the DownloadManager manager.download(); , ),
The onPressed callback calls the download method of the DownloadManager class, which will start the download process and update the progress value. I will explain how to implement this method later.
Implement the download logic using Dio package
The third step is to implement the download logic using Dio package. Dio is a powerful HTTP client for Flutter that supports features like interceptors, global configuration, form data, request cancellation, file downloading, etc. You can install it by adding this line to your pubspec.yaml file:
dependencies: dio: ^4.0.4
Then, you can import it in your code like this:
import 'package:dio/dio.dart';
To download a file using Dio, you need to create an instance of Dio class and call its download method. The method takes three parameters: the URL of the file, the path where to save the file, and an optional onReceiveProgress callback that reports the download progress. Here is an example:
class DownloadManager // Create a Dio instance final dio = Dio(); // Define the URL of the file to download final url = ' // Define the path where to save the file final path = '/storage/emulated/0/Download/file.zip'; // Define a ValueNotifier to store and notify the progress value final progressNotifier = ValueNotifier(null); // Define a method to start downloading the file Future download() async try // Call the download method of Dio await dio.download( url, path, onReceiveProgress: (received, total) // Calculate the percentage of completion double percent = received / total; // Update the progress value using ValueNotifier progressNotifier.value = percent; , ); catch (e) // Handle any errors or exceptions print(e);
The onReceiveProgress callback receives two parameters: received and total, which are the number of bytes received and the total number of bytes of th