smart_cached_network_image 1.0.0
smart_cached_network_image: ^1.0.0 copied to clipboard
A smart cached network image package with queue management, retry logic, and rate limiting
example/smart_cached_network_image_example.dart
import 'package:flutter/material.dart';
import 'package:smart_cached_network_image/smart_cached_network_image.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(final BuildContext context) {
return MaterialApp(
title: 'Smart Cached Network Image Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final List<String> _imageUrls = [
'https://picsum.photos/300/200?random=1',
'https://picsum.photos/300/200?random=2',
'https://picsum.photos/300/200?random=3',
'https://picsum.photos/300/200?random=4',
'https://picsum.photos/300/200?random=5',
'https://picsum.photos/300/200?random=6',
'https://picsum.photos/300/200?random=7',
'https://picsum.photos/300/200?random=8',
];
@override
void initState() {
super.initState();
_initializeImageProvider();
}
Future<void> _initializeImageProvider() async {
await SmartCachedNetworkImageProvider.initialize(
ImageLoadConfig(
maxConcurrentRequests: 2,
requestDelay: Duration(milliseconds: 100),
),
);
}
@override
Widget build(final BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Smart Cached Network Image Example'),
actions: [
IconButton(
icon: const Icon(Icons.refresh),
onPressed: () {
setState(() {
_imageUrls.shuffle();
});
},
),
IconButton(
icon: const Icon(Icons.clear),
onPressed: () async {
await SmartCachedNetworkImageProvider.cacheManager.clearCache();
setState(() {});
},
),
],
),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Text('Loading queue: ${SmartCachedNetworkImageProvider.queueLength}'),
Text('Currently loading: ${SmartCachedNetworkImageProvider.loadingCount}'),
Text('Cached files: ${SmartCachedNetworkImageProvider.cacheManager.cachedFilesCount}'),
],
),
),
Expanded(
child: GridView.builder(
padding: const EdgeInsets.all(16.0),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 16.0,
mainAxisSpacing: 16.0,
),
itemCount: _imageUrls.length,
itemBuilder: (final BuildContext context, final int index) {
return Card(
elevation: 4.0,
child: Column(
children: [
Expanded(
child: SmartCachedNetworkImage(
imageUrl: _imageUrls[index],
placeholder: const Center(
child: CircularProgressIndicator(),
),
errorWidget: const Center(
child: Icon(Icons.error, color: Colors.red),
),
fit: BoxFit.cover,
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'Image ${index + 1}',
style: const TextStyle(fontSize: 12),
),
),
],
),
);
},
),
),
Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
const Text('FutureBuilder Example:'),
const SizedBox(height: 8.0),
SizedBox(
height: 100,
child: SmartCachedNetworkImageFuture(
imageUrl: 'https://picsum.photos/200/100?random=9',
placeholder: const Center(
child: CircularProgressIndicator(),
),
errorWidget: const Center(
child: Icon(Icons.error, color: Colors.red),
),
fit: BoxFit.cover,
),
),
],
),
),
],
),
);
}
}