246 lines
5.0 KiB
Markdown
246 lines
5.0 KiB
Markdown
---
|
|
name: widgets-images
|
|
description: Flutter Image widget, AssetImage, NetworkImage, ImageProvider, and image loading
|
|
---
|
|
|
|
# Image Widgets
|
|
|
|
Flutter provides widgets for displaying images from various sources.
|
|
|
|
## Image Widget
|
|
|
|
Display images from different sources.
|
|
|
|
```dart
|
|
// Asset image
|
|
Image.asset(
|
|
'assets/images/logo.png',
|
|
width: 100,
|
|
height: 100,
|
|
fit: BoxFit.cover,
|
|
)
|
|
|
|
// Network image
|
|
Image.network(
|
|
'https://example.com/image.jpg',
|
|
width: 200,
|
|
height: 200,
|
|
loadingBuilder: (context, child, loadingProgress) {
|
|
if (loadingProgress == null) return child;
|
|
return CircularProgressIndicator(
|
|
value: loadingProgress.expectedTotalBytes != null
|
|
? loadingProgress.cumulativeBytesLoaded / loadingProgress.expectedTotalBytes!
|
|
: null,
|
|
);
|
|
},
|
|
errorBuilder: (context, error, stackTrace) {
|
|
return Icon(Icons.error);
|
|
},
|
|
)
|
|
|
|
// File image
|
|
Image.file(
|
|
File('/path/to/image.jpg'),
|
|
width: 100,
|
|
height: 100,
|
|
)
|
|
|
|
// Memory image
|
|
Image.memory(
|
|
Uint8List.fromList(imageBytes),
|
|
width: 100,
|
|
height: 100,
|
|
)
|
|
```
|
|
|
|
## Image Properties
|
|
|
|
```dart
|
|
Image.asset(
|
|
'assets/images/logo.png',
|
|
width: 200,
|
|
height: 200,
|
|
fit: BoxFit.cover, // cover, contain, fill, fitWidth, fitHeight, none, scaleDown
|
|
alignment: Alignment.center,
|
|
repeat: ImageRepeat.noRepeat, // noRepeat, repeat, repeatX, repeatY
|
|
matchTextDirection: false,
|
|
gaplessPlayback: false, // Keep showing old image while loading new one
|
|
filterQuality: FilterQuality.low, // low, medium, high, none
|
|
isAntiAlias: true,
|
|
frameBuilder: (context, child, frame, wasSynchronouslyLoaded) {
|
|
if (wasSynchronouslyLoaded) return child;
|
|
return AnimatedOpacity(
|
|
opacity: frame == null ? 0 : 1,
|
|
duration: const Duration(milliseconds: 200),
|
|
child: child,
|
|
);
|
|
},
|
|
)
|
|
```
|
|
|
|
## ImageProvider
|
|
|
|
Use ImageProvider for advanced image loading.
|
|
|
|
### AssetImage
|
|
|
|
```dart
|
|
Image(
|
|
image: AssetImage('assets/images/logo.png'),
|
|
width: 100,
|
|
height: 100,
|
|
)
|
|
|
|
// With package
|
|
AssetImage('assets/logo.png', package: 'my_package')
|
|
```
|
|
|
|
### NetworkImage
|
|
|
|
```dart
|
|
Image(
|
|
image: NetworkImage('https://example.com/image.jpg'),
|
|
width: 100,
|
|
height: 100,
|
|
)
|
|
|
|
// With headers
|
|
NetworkImage(
|
|
'https://example.com/image.jpg',
|
|
headers: {'Authorization': 'Bearer token'},
|
|
)
|
|
```
|
|
|
|
### FileImage
|
|
|
|
```dart
|
|
Image(
|
|
image: FileImage(File('/path/to/image.jpg')),
|
|
width: 100,
|
|
height: 100,
|
|
)
|
|
```
|
|
|
|
### MemoryImage
|
|
|
|
```dart
|
|
Image(
|
|
image: MemoryImage(Uint8List.fromList(imageBytes)),
|
|
width: 100,
|
|
height: 100,
|
|
)
|
|
```
|
|
|
|
## FadeInImage
|
|
|
|
Image with fade-in animation.
|
|
|
|
```dart
|
|
FadeInImage.assetNetwork(
|
|
placeholder: 'assets/placeholder.png',
|
|
image: 'https://example.com/image.jpg',
|
|
width: 200,
|
|
height: 200,
|
|
fadeInDuration: const Duration(milliseconds: 300),
|
|
fadeOutDuration: const Duration(milliseconds: 100),
|
|
)
|
|
|
|
FadeInImage.memoryNetwork(
|
|
placeholder: kTransparentImage, // From transparent_image package
|
|
image: 'https://example.com/image.jpg',
|
|
)
|
|
```
|
|
|
|
## Image Caching
|
|
|
|
Precache images for better performance.
|
|
|
|
```dart
|
|
// Precache asset image
|
|
precacheImage(
|
|
AssetImage('assets/images/logo.png'),
|
|
context,
|
|
);
|
|
|
|
// Precache network image
|
|
precacheImage(
|
|
NetworkImage('https://example.com/image.jpg'),
|
|
context,
|
|
).then((_) {
|
|
// Image is cached
|
|
});
|
|
|
|
// Check cache status
|
|
final status = await imageProvider.obtainCacheStatus(
|
|
configuration: createLocalImageConfiguration(context),
|
|
);
|
|
print('Cache status: ${status.status}'); // pending, live, keepAlive
|
|
```
|
|
|
|
## Image Error Handling
|
|
|
|
```dart
|
|
Image.network(
|
|
'https://example.com/image.jpg',
|
|
errorBuilder: (context, error, stackTrace) {
|
|
return Container(
|
|
width: 100,
|
|
height: 100,
|
|
color: Colors.grey[300],
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Icon(Icons.error, color: Colors.red),
|
|
Text('Failed to load', style: TextStyle(fontSize: 10)),
|
|
],
|
|
),
|
|
);
|
|
},
|
|
loadingBuilder: (context, child, loadingProgress) {
|
|
if (loadingProgress == null) return child;
|
|
return Center(
|
|
child: CircularProgressIndicator(
|
|
value: loadingProgress.expectedTotalBytes != null
|
|
? loadingProgress.cumulativeBytesLoaded / loadingProgress.expectedTotalBytes!
|
|
: null,
|
|
),
|
|
);
|
|
},
|
|
)
|
|
```
|
|
|
|
## ImageIcon
|
|
|
|
Use images as icons.
|
|
|
|
```dart
|
|
ImageIcon(
|
|
AssetImage('assets/icons/custom_icon.png'),
|
|
size: 48,
|
|
color: Colors.blue,
|
|
)
|
|
|
|
ImageIcon(
|
|
NetworkImage('https://example.com/icon.png'),
|
|
size: 48,
|
|
)
|
|
```
|
|
|
|
## Key Points
|
|
|
|
- Use `Image.asset()` for local assets
|
|
- Use `Image.network()` for network images
|
|
- Use `Image.file()` for file system images
|
|
- Use `Image.memory()` for in-memory images
|
|
- Use `FadeInImage` for smooth loading transitions
|
|
- Precache images for better performance
|
|
- Always provide error builders for network images
|
|
- Use `BoxFit` to control how images fill their bounds
|
|
- Configure image cache size in `ImageCache` if needed
|
|
|
|
<!--
|
|
Source references:
|
|
- https://github.com/flutter/flutter/tree/main/packages/flutter/lib/src/widgets/image.dart
|
|
- https://docs.flutter.dev/development/ui/widgets/images
|
|
-->
|