Flutter widgets: how they work and how to create custom components
Build efficient UIs with Flutter by understanding and customising widgets to suit your needs
Mobile app development
27 February 2025
Text( 'Hello, Flutter!', style: TextStyle(fontSize: 20, color: Colors.blue), );
Container( width: 150, height: 150, padding: const EdgeInsets.symmetric( horizontal: 10, vertical: 6, ), decoration: BoxDecoration( color: Colors.red, borderRadius: BorderRadius.circular(10), ), child: const Text('Hello, Flutter!'), );
Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text('First item'), FlutterLogo(size: 50), Text('Third item'), ], );
Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text('First item'), FlutterLogo(size: 50), Text('Third item'), ], );
ListView( children: [ Container( height: 50, alignment: Alignment.center, color: Colors.blue[300], child: Text('First item'), ), Container( height: 50, alignment: Alignment.center, color: Colors.blue[200], child: Text('Second item'), ), Container( height: 50, alignment: Alignment.center, color: Colors.blue[100], child: Text('Third item'), ), ], );
final items = ['First item', 'Second item', 'Third item']; final colorCodes = [300, 200, 100]; Widget build(BuildContext context) { return ListView.builder( itemCount: items.length, itemBuilder: (context, index) { return Container( height: 50, alignment: Alignment.center, color: Colors.blue[colorCodes[index]], child: Text(items[index]), ); }, ); }
Scaffold( appBar: AppBar( title: Text('Flutter App'), leading: BackButton(), ), body: Center( child: Text('Hello, Flutter!'), ), floatingActionButton: FloatingActionButton( onPressed: () {}, child: Icon(Icons.add), ), ),
Stack( children: [ Container(color: Colors.blue, width: 100, height: 100), Positioned( top: 10, left: 10, child: Container( color: Colors.red, width: 50, height: 50, ), ), ], );
class CustomButton extends StatelessWidget { final String text; final Color color; final VoidCallback onPressed; const CustomButton({super.key, required this.text, required this.color, required this.onPressed}); @override Widget build(BuildContext context) { return ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: color, ), onPressed: onPressed, child: Text( text, style: TextStyle(color: Colors.white), ), ); } }
CustomButton( text: "Custom Button", color: Colors.blue, onPressed: () { print("Button pressed"); }, ),
class PasswordFieldWidget extends StatefulWidget { final String label; const PasswordFieldWidget({super.key, required this.label}); @override State<StatefulWidget> createState() => PasswordFieldState(); } class PasswordFieldState extends State<PasswordFieldWidget> { bool hiddenPassword = true; @override Widget build(BuildContext context) { return TextFormField( obscureText: hiddenPassword, decoration: InputDecoration( label: Text(widget.label), suffixIcon: IconButton( icon: Icon(hiddenPassword ? Icons.visibility : Icons.visibility_off), onPressed: () { setState(() => hiddenPassword = !hiddenPassword); }, ), ), ); } }
Column( children: [ PasswordFieldWidget(label: "Current password"), PasswordFieldWidget(label: "New password"), ], ),