Reading time: 2 minutes
I’m going to show you an example of how to customize a loader to appear when we need to load data in our application.
The loader element is as follows:
class Loader extends StatelessWidget { @override Widget build(BuildContext context) { return Center( child: Container( padding: EdgeInsets.all(16.0), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(10.0), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.1), blurRadius: 10.0, offset: Offset(0, 5), ), ], ), child: Column( mainAxisSize: MainAxisSize.min, children: [ CircularProgressIndicator( valueColor: AlwaysStoppedAnimation<Color>(Colors.purple), backgroundColor: Colors.teal, strokeWidth: 4, ), SizedBox(height: 16.0), Text( 'Loading...', style: TextStyle( fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ], ), ), ); } }
To customize the colors and width of the loader element, we need to focus on the following part of the code:
CircularProgressIndicator( valueColor: AlwaysStoppedAnimation<Color>(Colors.purple), backgroundColor: Colors.teal, strokeWidth: 4, ),
Here is the complete code:
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Demo for DevCodeLight', theme: ThemeData( primarySwatch: Colors.blue, ), home: HomePage(), ); } } class HomePage extends StatelessWidget { void fetchData() async { await Future.delayed(Duration(seconds: 2)); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Demo for DevCodeLight'), ), body: Center( child: ElevatedButton( onPressed: () { showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return Dialog( backgroundColor: Colors.transparent, elevation: 0, child: Loader(), ); }, ); Future.delayed(Duration(seconds: 2), () { Navigator.pop( context); // Close the loader dialog after 2 seconds (simulation) }); }, child: Text('Load Data'), ), ), ); } } class Loader extends StatelessWidget { @override Widget build(BuildContext context) { return Center( child: Container( padding: EdgeInsets.all(16.0), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(10.0), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.1), blurRadius: 10.0, offset: Offset(0, 5), ), ], ), child: Column( mainAxisSize: MainAxisSize.min, children: [CircularProgressIndicator( valueColor: AlwaysStoppedAnimation<Color>(Colors.purple), backgroundColor: Colors.teal, strokeWidth: 4, ), SizedBox(height: 16.0), Text( 'Loading...', style: TextStyle( fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ], ), ), ); } }
I hope this helps, have a great day!