Flutter widgets are the foundation of any Flutter application, enabling you to create stunning, responsive user interfaces. Whether you’re using basic widgets, input widgets, display widgets, or creating custom widgets, mastering Flutter’s widget system is key to building interactive and visually appealing apps. This guide covers everything from StatelessWidgets
to StatefulWidgets
, providing examples and tips to enhance your Flutter development skills.
1. Types of Widgets
In Flutter, widgets can be broadly categorized into two types: StatelessWidgets and StatefulWidgets.
StatelessWidget
A StatelessWidget
is a widget that does not change its state over time. Once created, a stateless widget cannot be modified. It’s ideal for UI elements that don’t need to react to user input or data changes.
Example 1: Stateless Widget Example
import 'package:flutter/material.dart';
class MyStatelessWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text('Hello, Flutter!'),
);
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Stateless Widget')),
body: MyStatelessWidget(),
),
));
}
In this example, the MyStatelessWidget
class creates a simple widget that displays a text message. The widget doesn’t maintain any state, making it a StatelessWidget
.
Example 2: Stateless Image Widget
import 'package:flutter/material.dart';
class ImageWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Image.network('https://via.placeholder.com/150'),
);
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Stateless Image Widget')),
body: ImageWidget(),
),
));
}
In this example, the ImageWidget
displays an image from a network URL. Since the image doesn’t change, it is implemented as a StatelessWidget
.
StatefulWidget
A StatefulWidget
is a widget that can change its state during its lifetime. This is useful for interactive elements, where the widget needs to update based on user actions or data changes.
Example 1: Stateful Counter Widget
import 'package:flutter/material.dart';
class CounterWidget extends StatefulWidget {
@override
_CounterWidgetState createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('You have pressed the button this many times:'),
Text('$_counter', style: Theme.of(context).textTheme.headline4),
ElevatedButton(
onPressed: _incrementCounter,
child: Text('Increment'),
),
],
),
);
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Stateful Counter Widget')),
body: CounterWidget(),
),
));
}
In this example, the CounterWidget
is a StatefulWidget
that displays a counter. Each time the user presses the button, the counter is incremented, and the widget updates its display.
Example 2: Stateful Toggle Widget
import 'package:flutter/material.dart';
class ToggleWidget extends StatefulWidget {
@override
_ToggleWidgetState createState() => _ToggleWidgetState();
}
class _ToggleWidgetState extends State<ToggleWidget> {
bool _isOn = false;
void _toggleSwitch() {
setState(() {
_isOn = !_isOn;
});
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Switch(
value: _isOn,
onChanged: (value) {
_toggleSwitch();
},
),
Text(_isOn ? 'Switch is ON' : 'Switch is OFF'),
],
),
);
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Stateful Toggle Widget')),
body: ToggleWidget(),
),
));
}
In this example, the ToggleWidget
is a StatefulWidget
that displays a switch. The switch toggles between ON and OFF states, and the widget updates the displayed text accordingly.
2. Basic Flutter Widgets
Flutter provides a rich set of basic widgets that you can use to build your UI. These include layout widgets, input widgets, and display widgets.
Layout Widgets
Layout widgets help you arrange other widgets on the screen. Common layout widgets include Container
, Row
, Column
, and Stack
.
Example 1: Row and Column Widgets
import 'package:flutter/material.dart';
class RowColumnWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Row 1, Column 1'),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Row 2, Column 1'),
SizedBox(width: 20),
Text('Row 2, Column 2'),
],
),
],
);
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Row and Column Widgets')),
body: RowColumnWidget(),
),
));
}
In this example, Row
and Column
widgets are used to arrange text elements horizontally and vertically.
Example 2: Container Widget
import 'package:flutter/material.dart';
class ContainerWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Container(
width: 100,
height: 100,
color: Colors.blue,
child: Center(child: Text('Hello')),
),
);
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Container Widget')),
body: ContainerWidget(),
),
));
}
In this example, the Container
widget is used to create a blue box with a text label centered inside it.
Input Widgets
Input widgets allow users to interact with your app. Common input widgets include TextField
, Checkbox
, Radio
, and Switch
.
Example 1: TextField Widget
import 'package:flutter/material.dart';
class TextFieldWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: TextField(
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: 'Enter your name',
),
),
);
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('TextField Widget')),
body: TextFieldWidget(),
),
));
}
In this example, the TextField
widget allows the user to input text.
Example 2: Checkbox Widget
import 'package:flutter/material.dart';
class CheckboxWidget extends StatefulWidget {
@override
_CheckboxWidgetState createState() => _CheckboxWidgetState();
}
class _CheckboxWidgetState extends State<CheckboxWidget> {
bool _isChecked = false;
void _toggleCheckbox(bool? value) {
setState(() {
_isChecked = value!;
});
}
@override
Widget build(BuildContext context) {
return Center(
child: CheckboxListTile(
title: Text('Accept Terms and Conditions'),
value: _isChecked,
onChanged: _toggleCheckbox,
),
);
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Checkbox Widget')),
body: CheckboxWidget(),
),
));
}
In this example, the Checkbox
widget allows the user to toggle a checkbox on or off.
3. Display Widgets
Display widgets are used to present information to the user. Common display widgets include Text
, Image
, and Icon
.
Example 1: Text Widget
import 'package:flutter/material.dart';
class TextWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text(
'Welcome to Flutter!',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
);
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Text Widget')),
body: TextWidget(),
),
));
}
In this example, the Text
widget displays a welcome message with custom styling.
Example 2: Icon Widget
import 'package:flutter/material.dart';
class IconWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Icon(
Icons.thumb_up,
color: Colors.blue,
size: 50.0,
),
);
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Icon Widget')),
body: IconWidget(),
),
));
}
In this example, the Icon
widget displays a thumbs-up icon with custom color and size.
4. Custom Widgets
In Flutter, you can create custom widgets by combining existing widgets or by creating entirely new ones that suit your needs. Custom widgets are an essential part of building a unique and reusable UI.
Example 1: Custom Button Widget
import 'package:flutter/material.dart';
class CustomButton extends StatelessWidget {
final String label;
final VoidCallback onPressed;
CustomButton({required this.label, required this.onPressed});
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: onPressed,
child: Text(label),
style: ElevatedButton.styleFrom(
primary: Colors.green,
padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12),
),
);
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Custom Button Widget')),
body: Center(
child: CustomButton(
label: 'Click Me',
onPressed: () {
print('Button Pressed!');
},
),
),
),
));
}
In this example, the CustomButton
widget is a reusable button with custom styling and a label that you can specify when using the widget.
Example 2: Custom Card Widget
import 'package:flutter/material.dart';
class CustomCard extends StatelessWidget {
final String title;
final String description;
CustomCard({required this.title, required this.description});
@override
Widget build(BuildContext context) {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
title,
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
SizedBox(height: 8),
Text(description),
],
),
),
);
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Custom Card Widget')),
body: Center(
child: CustomCard(
title: 'Flutter Card',
description: 'This is a custom card widget in Flutter.',
),
),
),
));
}
In this example, the CustomCard
widget combines several widgets to create a card layout with a title and description.
Conclusion
Flutter widgets are the building blocks of any Flutter application, providing a wide range of UI components to create beautiful and interactive user interfaces. By understanding the different types of widgets—such as StatelessWidget
and StatefulWidget
—and mastering basic, input, display, and custom widgets, you can build highly functional and visually appealing apps. With the ability to create custom widgets, you can design reusable components that enhance the flexibility and maintainability of your Flutter projects.
Happy Coding…!!!
Leave a Reply