Adding Images, Icons, and Visual Elements in Flutter – Detailed Notes
Images, icons, and other visual elements are essential for creating attractive and user-friendly Flutter applications. Flutter provides widgets and asset-management features that allow developers to display local images, network images, icons, illustrations, backgrounds, avatars, badges, decorative elements, and interactive visual components.
In Flutter, visible elements such as text, images, and icons are widgets, and they can be combined with layout widgets such as Row, Column, Stack, Container, Card, and GridView to create complete interfaces.
1. What Are Visual Elements in Flutter?
Visual elements are UI components that help users understand information and interact with an application.
- Images
- Icons
- Logos
- Avatars
- Illustrations
- Background images
- Badges
- Dividers
- Cards
- Decorative shapes
- Buttons with icons
- Images combined with text
Examples
Image.asset('assets/images/logo.png')
Icon(Icons.home)
CircleAvatar(
backgroundImage: AssetImage('assets/images/profile.jpg'),
)
Container(
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(12),
),
)
2. Adding Images to a Flutter Project
Flutter applications can include images as bundled assets. Asset files are declared in the pubspec.yaml file and can then be accessed from Dart code. Flutter supports common image formats such as PNG, JPEG, WebP, GIF, animated WebP/GIF, BMP, and WBMP.
Recommended Folder Structure
my_flutter_app/
├── lib/
│ └── main.dart
├── assets/
│ ├── images/
│ │ ├── logo.png
│ │ ├── profile.jpg
│ │ ├── banner.jpg
│ │ └── product.jpg
│ └── icons/
│ └── custom_icon.png
└── pubspec.yaml
Flutter uses the assets section of pubspec.yaml to identify resources that should be bundled with the application. :contentReference[oaicite:0]{index=0}
3. Declaring Images in pubspec.yaml
Individual files can be declared explicitly.
flutter:
uses-material-design: true
assets:
- assets/images/logo.png
- assets/images/profile.jpg
- assets/images/banner.jpg
You can also declare an entire directory.
flutter:
uses-material-design: true
assets:
- assets/images/
Correct YAML indentation is important. The assets: entry must be nested under flutter:.
4. Displaying a Local Image
The simplest way to display a bundled image is Image.asset().
Image.asset(
'assets/images/logo.png',
)
Complete Example
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
title: const Text('Local Image'),
),
body: Center(
child: Image.asset(
'assets/images/logo.png',
),
),
),
);
}
}
5. Setting Image Width and Height
The width and height properties control the displayed size of an image.
Image.asset(
'assets/images/product.jpg',
width: 250,
height: 250,
)
Full Width Image
Image.asset(
'assets/images/banner.jpg',
width: double.infinity,
height: 220,
)
6. Using BoxFit with Images
BoxFit controls how an image is fitted inside the available space.
| BoxFit | Purpose |
BoxFit.cover | Fills the available area while maintaining the image aspect ratio. Parts of the image may be cropped. |
BoxFit.contain | Displays the complete image while maintaining its aspect ratio. |
BoxFit.fill | Fills the available area but may distort the image. |
BoxFit.fitWidth | Fits the image based on the available width. |
BoxFit.fitHeight | Fits the image based on the available height. |
BoxFit.none | Displays the image without scaling it to fill the available space. |
BoxFit.scaleDown | Scales the image down when necessary while maintaining its aspect ratio. |
Example
Image.asset(
'assets/images/banner.jpg',
width: double.infinity,
height: 220,
fit: BoxFit.cover,
)
7. Loading Images from the Internet
Flutter provides Image.network() for displaying images from URLs.
Image.network(
'https://picsum.photos/400',
)
Complete Example
import 'package:flutter/material.dart';
class NetworkImageExample extends StatelessWidget {
const NetworkImageExample({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Network Image'),
),
body: Center(
child: Image.network(
'https://picsum.photos/400',
width: 300,
height: 300,
fit: BoxFit.cover,
),
),
);
}
}
The Flutter documentation recommends Image.network() when an image needs to be loaded from a URL. :contentReference[oaicite:1]{index=1}
8. Handling Network Image Loading
Network images can take time to load. A loading indicator can be displayed using loadingBuilder.
Image.network(
'https://picsum.photos/400',
loadingBuilder: (
BuildContext context,
Widget child,
ImageChunkEvent? loadingProgress,
) {
if (loadingProgress == null) {
return child;
}
return const Center(
child: CircularProgressIndicator(),
);
},
)
9. Handling Network Image Errors
Use errorBuilder to display an alternative widget when an image cannot be loaded.
Image.network(
'https://example.com/invalid-image.jpg',
errorBuilder: (
BuildContext context,
Object error,
StackTrace? stackTrace,
) {
return const Icon(
Icons.broken_image,
size: 80,
color: Colors.grey,
);
},
)
10. Creating Rounded Images
ClipRRect can be used to give an image rounded corners.
ClipRRect(
borderRadius: BorderRadius.circular(20),
child: Image.asset(
'assets/images/profile.jpg',
width: 200,
height: 200,
fit: BoxFit.cover,
),
)
Rounded Banner
ClipRRect(
borderRadius: BorderRadius.circular(15),
child: Image.asset(
'assets/images/banner.jpg',
width: double.infinity,
height: 200,
fit: BoxFit.cover,
),
)
11. Creating Circular Images
Circular images are commonly used for profile pictures.
Using ClipOval
ClipOval(
child: Image.asset(
'assets/images/profile.jpg',
width: 120,
height: 120,
fit: BoxFit.cover,
),
)
Using CircleAvatar
CircleAvatar(
radius: 60,
backgroundImage: const AssetImage(
'assets/images/profile.jpg',
),
)
12. Creating an Image Background
An image can be used as a background through DecorationImage.
Container(
width: double.infinity,
height: 300,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage(
'assets/images/background.jpg',
),
fit: BoxFit.cover,
),
),
child: const Center(
child: Text(
'Welcome to Flutter',
style: TextStyle(
color: Colors.white,
fontSize: 30,
fontWeight: FontWeight.bold,
),
),
),
)
13. Adding an Overlay to an Image
A Stack allows multiple visual elements to be placed on top of each other. This is useful for image overlays, badges, labels, buttons, and gradients.
Stack(
children: [
Image.asset(
'assets/images/banner.jpg',
width: double.infinity,
height: 250,
fit: BoxFit.cover,
),
Positioned(
left: 20,
bottom: 20,
child: Container(
padding: const EdgeInsets.all(10),
color: Colors.black54,
child: const Text(
'Flutter Course',
style: TextStyle(
color: Colors.white,
fontSize: 22,
fontWeight: FontWeight.bold,
),
),
),
),
],
)
14. Adding a Gradient Overlay
Gradients can improve text readability when text is displayed over an image.
Stack(
children: [
Image.asset(
'assets/images/banner.jpg',
width: double.infinity,
height: 300,
fit: BoxFit.cover,
),
Positioned.fill(
child: DecoratedBox(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Colors.transparent,
Colors.black87,
],
),
),
),
),
const Positioned(
left: 20,
bottom: 20,
child: Text(
'Learn Flutter',
style: TextStyle(
color: Colors.white,
fontSize: 28,
fontWeight: FontWeight.bold,
),
),
),
],
)
15. What Are Icons?
Icons are small visual symbols used to communicate actions, navigation options, statuses, and information.
Flutter provides Material Design icons through the Icons class when Material support is enabled.
Icon(Icons.home)
Styled Icon
Icon(
Icons.favorite,
size: 40,
color: Colors.red,
)
16. Common Flutter Icons
| Purpose | Icon |
| Home | Icons.home |
| Search | Icons.search |
| Menu | Icons.menu |
| Settings | Icons.settings |
| User | Icons.person |
| Favorite | Icons.favorite |
| Delete | Icons.delete |
| Edit | Icons.edit |
| Share | Icons.share |
| Shopping Cart | Icons.shopping_cart |
| Notifications | Icons.notifications |
| Location | Icons.location_on |
| Star | Icons.star |
| Camera | Icons.camera_alt |
| Download | Icons.download |
17. Changing Icon Size
Icon(
Icons.star,
size: 50,
)
18. Changing Icon Color
Icon(
Icons.favorite,
color: Colors.red,
size: 35,
)
19. IconButton for Interactive Icons
Use IconButton when the icon needs to perform an action.
IconButton(
icon: const Icon(Icons.favorite),
color: Colors.red,
iconSize: 35,
onPressed: () {
print('Favorite clicked');
},
)
IconButton with Tooltip
IconButton(
tooltip: 'Search',
icon: const Icon(Icons.search),
onPressed: () {
print('Search clicked');
},
)
20. Adding Icons to AppBar
Scaffold(
appBar: AppBar(
title: const Text('My Application'),
actions: [
IconButton(
tooltip: 'Search',
icon: const Icon(Icons.search),
onPressed: () {},
),
IconButton(
tooltip: 'Notifications',
icon: const Icon(Icons.notifications),
onPressed: () {},
),
IconButton(
tooltip: 'Settings',
icon: const Icon(Icons.settings),
onPressed: () {},
),
],
),
body: const Center(
child: Text('Home Screen'),
),
)
21. Icons with Text
Row can be used to place an icon beside text.
Row(
children: const [
Icon(
Icons.location_on,
color: Colors.red,
),
SizedBox(width: 8),
Text('Mumbai, India'),
],
)
Information Row
Row(
children: const [
Icon(Icons.email, size: 20),
SizedBox(width: 8),
Text('[email protected]'),
],
)
22. Icons Inside Buttons
ElevatedButton.icon
ElevatedButton.icon(
onPressed: () {},
icon: const Icon(Icons.download),
label: const Text('Download'),
)
TextButton.icon
TextButton.icon(
onPressed: () {},
icon: const Icon(Icons.edit),
label: const Text('Edit'),
)
OutlinedButton.icon
OutlinedButton.icon(
onPressed: () {},
icon: const Icon(Icons.share),
label: const Text('Share'),
)
23. Creating Icon Containers
An icon can be placed inside a decorated container to create modern UI components.
Container(
padding: const EdgeInsets.all(15),
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(15),
),
child: const Icon(
Icons.person,
color: Colors.white,
size: 35,
),
)
Circular Icon Background
Container(
padding: const EdgeInsets.all(15),
decoration: const BoxDecoration(
color: Colors.blue,
shape: BoxShape.circle,
),
child: const Icon(
Icons.home,
color: Colors.white,
size: 30,
),
)
24. Creating Notification Badges
A badge displays additional information such as a notification count. A Stack is useful for positioning the badge over an icon.
Stack(
children: [
IconButton(
icon: const Icon(Icons.notifications),
onPressed: () {},
),
Positioned(
right: 5,
top: 5,
child: Container(
padding: const EdgeInsets.all(4),
decoration: const BoxDecoration(
color: Colors.red,
shape: BoxShape.circle,
),
child: const Text(
'5',
style: TextStyle(
color: Colors.white,
fontSize: 10,
fontWeight: FontWeight.bold,
),
),
),
),
],
)
25. Combining Images and Icons
Images and icons can be combined to create profile cards, product cards, social media interfaces, dashboards, and e-commerce layouts.
Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Row(
children: [
ClipOval(
child: Image.asset(
'assets/images/profile.jpg',
width: 70,
height: 70,
fit: BoxFit.cover,
),
),
const SizedBox(width: 15),
const Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Rahul Sharma',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: 5),
Row(
children: [
Icon(
Icons.location_on,
size: 16,
color: Colors.grey,
),
SizedBox(width: 5),
Text('Mumbai'),
],
),
],
),
),
IconButton(
icon: const Icon(Icons.more_vert),
onPressed: () {},
),
],
),
),
)
26. Creating a Product Card
Card(
clipBehavior: Clip.antiAlias,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Stack(
children: [
Image.asset(
'assets/images/product.jpg',
width: double.infinity,
height: 220,
fit: BoxFit.cover,
),
Positioned(
right: 10,
top: 10,
child: Container(
decoration: const BoxDecoration(
color: Colors.white,
shape: BoxShape.circle,
),
child: IconButton(
icon: const Icon(Icons.favorite_border),
onPressed: () {},
),
),
),
],
),
Padding(
padding: const EdgeInsets.all(15),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'Premium Shoes',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 8),
const Row(
children: [
Icon(
Icons.star,
size: 20,
color: Colors.amber,
),
SizedBox(width: 5),
Text('4.8'),
],
),
const SizedBox(height: 8),
const Text(
'₹2,499',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 12),
SizedBox(
width: double.infinity,
child: ElevatedButton.icon(
onPressed: () {},
icon: const Icon(Icons.shopping_cart),
label: const Text('Add to Cart'),
),
),
],
),
),
],
),
)
27. Creating an Image Gallery
GridView can be used to display multiple images in a gallery.
GridView.count(
crossAxisCount: 2,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
padding: const EdgeInsets.all(10),
children: [
ClipRRect(
borderRadius: BorderRadius.circular(12),
child: Image.asset(
'assets/images/photo1.jpg',
fit: BoxFit.cover,
),
),
ClipRRect(
borderRadius: BorderRadius.circular(12),
child: Image.asset(
'assets/images/photo2.jpg',
fit: BoxFit.cover,
),
),
ClipRRect(
borderRadius: BorderRadius.circular(12),
child: Image.asset(
'assets/images/photo3.jpg',
fit: BoxFit.cover,
),
),
ClipRRect(
borderRadius: BorderRadius.circular(12),
child: Image.asset(
'assets/images/photo4.jpg',
fit: BoxFit.cover,
),
),
],
)
28. Resolution-Aware Images
Flutter supports resolution-aware image assets so that an appropriate image variant can be selected based on the device's pixel ratio.
Example Structure
assets/images/
├── logo.png
├── 2.0x/
│ └── logo.png
├── 3.0x/
│ └── logo.png
└── 4.0x/
└── logo.png
Flutter can select the resolution variant that most closely matches the device pixel ratio. :contentReference[oaicite:2]{index=2}
29. Using Images in Cards
Card(
elevation: 4,
clipBehavior: Clip.antiAlias,
child: Column(
children: [
Image.asset(
'assets/images/course.jpg',
width: double.infinity,
height: 180,
fit: BoxFit.cover,
),
const Padding(
padding: EdgeInsets.all(15),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Flutter Development',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: 8),
Text(
'Learn Flutter from beginner to advanced level.',
),
],
),
),
],
),
)
30. Creating Visual Separators
Not every visual element needs to be an image. Flutter provides widgets such as Divider for creating visual separation.
const Divider(
thickness: 1,
height: 30,
)
Custom Divider
Container(
height: 1,
width: double.infinity,
color: Colors.grey.shade300,
)
31. Creating Decorative Shapes
Container and BoxDecoration can be used to create circles, rounded rectangles, borders, and other decorative elements.
Container(
width: 100,
height: 100,
decoration: BoxDecoration(
color: Colors.blue,
shape: BoxShape.circle,
),
)
Rounded Rectangle
Container(
width: 200,
height: 100,
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(20),
),
)
32. Using Shadows with Visual Elements
Shadows can add depth to cards, images, buttons, and other UI components.
Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(15),
boxShadow: const [
BoxShadow(
blurRadius: 12,
spreadRadius: 2,
offset: Offset(0, 5),
color: Colors.black26,
),
],
),
child: Image.asset(
'assets/images/product.jpg',
width: 250,
height: 200,
fit: BoxFit.cover,
),
)
33. Creating a Profile Header
Column(
children: [
const CircleAvatar(
radius: 55,
backgroundImage: AssetImage(
'assets/images/profile.jpg',
),
),
const SizedBox(height: 12),
const Text(
'Amit Kumar',
style: TextStyle(
fontSize: 22,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 5),
const Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.location_on,
size: 18,
color: Colors.grey,
),
SizedBox(width: 4),
Text('Delhi, India'),
],
),
],
)
34. Creating a Dashboard Visual Card
Card(
child: Padding(
padding: const EdgeInsets.all(20),
child: Row(
children: [
Container(
padding: const EdgeInsets.all(15),
decoration: BoxDecoration(
color: Colors.blue.shade50,
borderRadius: BorderRadius.circular(12),
),
child: const Icon(
Icons.people,
size: 35,
color: Colors.blue,
),
),
const SizedBox(width: 15),
const Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Total Users',
style: TextStyle(
color: Colors.grey,
),
),
SizedBox(height: 5),
Text(
'12,450',
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
),
),
],
),
],
),
),
)
35. Combining Multiple Visual Elements with Stack
Stack is especially useful when visual elements need to overlap.
Stack(
alignment: Alignment.center,
children: [
ClipRRect(
borderRadius: BorderRadius.circular(20),
child: Image.asset(
'assets/images/banner.jpg',
width: double.infinity,
height: 250,
fit: BoxFit.cover,
),
),
Container(
padding: const EdgeInsets.all(15),
decoration: BoxDecoration(
color: Colors.black54,
borderRadius: BorderRadius.circular(12),
),
child: const Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Icons.play_circle,
color: Colors.white,
size: 40,
),
SizedBox(width: 10),
Text(
'Watch Now',
style: TextStyle(
color: Colors.white,
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
],
),
),
],
)
36. Custom Image Placeholder
A placeholder can be displayed while an image is loading.
Image.network(
'https://picsum.photos/500',
width: double.infinity,
height: 250,
fit: BoxFit.cover,
loadingBuilder: (
context,
child,
loadingProgress,
) {
if (loadingProgress == null) {
return child;
}
return Container(
width: double.infinity,
height: 250,
color: Colors.grey.shade200,
child: const Center(
child: CircularProgressIndicator(),
),
);
},
)
37. Using FadeInImage
FadeInImage can display a placeholder image and then fade into the final image.
FadeInImage.assetNetwork(
placeholder: 'assets/images/loading.gif',
image: 'https://picsum.photos/500',
width: 300,
height: 200,
fit: BoxFit.cover,
)
38. Creating a Complete Visual UI Example
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Visual Elements',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.blue,
),
useMaterial3: true,
),
home: const HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Flutter Visual UI'),
actions: [
IconButton(
tooltip: 'Search',
icon: const Icon(Icons.search),
onPressed: () {},
),
IconButton(
tooltip: 'Notifications',
icon: const Icon(Icons.notifications),
onPressed: () {},
),
],
),
body: SingleChildScrollView(
child: Column(
children: [
Stack(
children: [
Image.asset(
'assets/images/banner.jpg',
width: double.infinity,
height: 250,
fit: BoxFit.cover,
),
Positioned(
left: 20,
bottom: 20,
child: Container(
padding: const EdgeInsets.all(12),
color: Colors.black54,
child: const Text(
'Learn Flutter',
style: TextStyle(
color: Colors.white,
fontSize: 26,
fontWeight: FontWeight.bold,
),
),
),
),
],
),
const SizedBox(height: 20),
const CircleAvatar(
radius: 50,
backgroundImage: AssetImage(
'assets/images/profile.jpg',
),
),
const SizedBox(height: 10),
const Text(
'Flutter Developer',
style: TextStyle(
fontSize: 22,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 20),
Card(
margin: const EdgeInsets.all(16),
child: Padding(
padding: const EdgeInsets.all(20),
child: Row(
children: [
Container(
padding: const EdgeInsets.all(15),
decoration: BoxDecoration(
color: Colors.blue.shade50,
borderRadius: BorderRadius.circular(12),
),
child: const Icon(
Icons.code,
size: 35,
color: Colors.blue,
),
),
const SizedBox(width: 15),
const Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
'Flutter Development',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: 5),
Text(
'Build beautiful cross-platform applications.',
),
],
),
),
],
),
),
),
Padding(
padding: const EdgeInsets.all(16),
child: SizedBox(
width: double.infinity,
child: ElevatedButton.icon(
onPressed: () {},
icon: const Icon(Icons.play_arrow),
label: const Text('Start Learning'),
),
),
),
],
),
),
);
}
}
39. Images, Icons, and Visual Elements: Comparison
| Element | Flutter Widget | Common Use |
| Local image | Image.asset() | Logos, banners, product images |
| Network image | Image.network() | Remote/server images |
| Icon | Icon() | Navigation and actions |
| Interactive icon | IconButton() | Clickable actions |
| Profile image | CircleAvatar() | User profiles |
| Rounded image | ClipRRect() | Cards and banners |
| Overlay | Stack() | Text or buttons over images |
| Badge | Stack() + Positioned() | Notifications and labels |
| Visual separator | Divider() | Separate sections |
| Decorative shape | Container() + BoxDecoration | Modern UI decoration |
40. Performance Best Practices
- Use appropriately sized images instead of unnecessarily large files.
- Compress images before adding them to the application.
- Use
BoxFit according to the required layout.
- Use resolution-aware image assets where appropriate.
- Use placeholders while network images are loading.
- Handle network image failures with an appropriate fallback.
- Use lazy-loading lists or grids for large image collections.
- Avoid repeatedly downloading the same remote images unnecessarily.
- Use simple icons instead of images when an icon can communicate the same information.
- Use
const constructors where possible to reduce unnecessary widget rebuilding.
41. Accessibility Best Practices
- Use meaningful tooltips for icon-only interactive controls.
- Do not use icons as the only way to communicate critical information without appropriate context.
- Use readable text over images by providing sufficient contrast.
- Do not place important information in decorative images only.
- Use semantic labels where appropriate for accessibility.
- Ensure buttons containing icons have a sufficiently large interactive area.
Example
IconButton(
tooltip: 'Delete item',
icon: const Icon(Icons.delete),
onPressed: () {},
)
42. Common Mistakes
Mistake 1: Incorrect Asset Path
Image.asset('images/logo.png')
If the actual path is assets/images/logo.png, use the correct path.
Correct Version
Image.asset('assets/images/logo.png')
Mistake 2: Forgetting pubspec.yaml
An image placed inside the project is not automatically available as a Flutter asset. The asset needs to be declared correctly in pubspec.yaml.
Mistake 3: Incorrect YAML Indentation
flutter:
assets:
- assets/images/
Mistake 4: Oversized Images
Using extremely large image files can increase memory usage and negatively affect application performance.
Mistake 5: No Network Error State
Network images can fail. Always consider an error state for important remote images.
Mistake 6: Using Too Many Decorative Elements
Too many images, shadows, icons, gradients, and decorations can make an interface visually confusing. Use visual elements to support the content rather than overwhelm it.
43. Practice Exercises
- Create a Flutter screen displaying a local company logo.
- Create a profile screen with a circular profile image and location icon.
- Create a product card containing an image, price, rating icon, favorite icon, and shopping cart button.
- Create a two-column image gallery using
GridView.
- Create a banner using an image with a gradient overlay and text.
- Create a notification icon with a red notification badge.
- Create a dashboard with four cards containing different icons.
- Create an AppBar with search, notification, and settings icons.
- Create a network image with loading and error states.
- Create a complete profile card using an image, icons, text, buttons, and decorative containers.
44. Interview Questions
- How do you add local images to a Flutter project?
- Why is
pubspec.yaml required for local assets?
- What is the difference between
Image.asset() and Image.network()?
- What is
BoxFit.cover?
- How can you create a circular image?
- How can you create an image with rounded corners?
- How can you display an image as a background?
- How can you display text over an image?
- What is the purpose of
Stack and Positioned?
- What is the difference between
Icon and IconButton?
- How can you change an icon's color and size?
- How can you add an icon to an ElevatedButton?
- How can you display a loading indicator for a network image?
- How can you handle a failed network image?
- What are resolution-aware image assets?
45. Key Takeaways
- Flutter treats images, icons, text, and many other UI elements as widgets.
- Use
Image.asset() for bundled local images.
- Use
Image.network() for images loaded from URLs.
- Declare local assets correctly in
pubspec.yaml.
- Use
BoxFit to control how images fit into available space.
- Use
ClipRRect for rounded images and ClipOval or CircleAvatar for circular images.
- Use
Icon for displaying icons and IconButton for interactive icons.
- Use
Stack and Positioned to create overlays and badges.
- Use
Container, BoxDecoration, gradients, borders, and shadows to create visual designs.
- Use loading and error states for network images.
- Optimize image sizes and use appropriate resolution variants for better performance.
- Combine images, icons, text, cards, buttons, and layout widgets to build professional Flutter interfaces.
46. Learning Resources
JustAcademy Flutter Training: https://www.justacademy.co/course-detail/flutter-training
Register for Course Demo: https://www.justacademy.co/register-for-course-demo
Official Flutter Assets and Images Documentation: Flutter Assets and Images
Official Flutter Assets, Images, and Icon Widgets: Assets, Images, and Icon Widgets
Official Flutter Network Images Guide: Display Images from the Internet
Official Flutter Layout Documentation: Flutter Layouts