Flutter网络图片缓存与加载插件rxcache_network_image的使用
Flutter网络图片缓存与加载插件rxcache_network_image的使用
rxcache_network_image
是一个用于Flutter应用中高效加载和缓存网络图片的插件。它支持磁盘缓存和内存缓存,并且允许预加载图片以提高用户体验。
主要特性
- 磁盘缓存图片
- 内存缓存图片
- 使用
RxCacheManager
预加载图片
开始使用
首先,在你的 pubspec.yaml
文件中添加依赖:
dependencies:
rxcache_network_image: 1.0.7
然后运行 flutter pub get
来安装这个包。
基本用法
显示缓存的网络图片
你可以使用 RxImage.cacheNetwork
小部件来显示缓存的网络图片:
RxImage.cacheNetwork(
url: 'https://example.com/image.png',
);
设置内存缓存大小
你可以通过 setMemoryCache
方法设置内存缓存的大小:
cacheManager.setMemoryCache(size); // size in bytes
下载图片
使用 download
方法下载并缓存图片:
cacheManager.download(url: 'https://example.com/image.png');
获取缓存文件
使用 getFile
方法获取缓存的文件:
final file = await cacheManager.getFile('https://example.com/image.png');
创建自定义 CacheManager
你可以创建自己的 CacheManager
类,以便根据需要进行定制:
class CustomCacheManager extends BaseRxCacheManager {
static CustomCacheManager? _instance;
CustomCacheManager._({String folder = "rx_image_cache"}) : super(folder: folder);
factory CustomCacheManager({String folder = "rx_image_cache"}) {
_instance ??= CustomCacheManager._(folder: folder);
return _instance!;
}
}
示例代码
以下是一个完整的示例,展示了如何在Flutter应用中使用 rxcache_network_image
插件:
import 'package:flutter/material.dart';
import 'package:rxcache_network_image/rxcache_network_image.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final cacheManager = RxCacheManager();
final showList = ValueNotifier(true);
bool allowLoad = true;
final items = [
"https://images.pexels.com/photos/18280488/pexels-photo-18280488.jpeg?auto=compress&cs=tinysrgb&w=1200&lazy=load",
"https://images.pexels.com/photos/19564349/pexels-photo-19564349.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2",
];
[@override](/user/override)
void didChangeDependencies() async {
for (var element in urls) {
cacheManager.download(url: element);
}
super.didChangeDependencies();
}
[@override](/user/override)
void dispose() {
showList.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Column(
children: [
const SizedBox(height: 30),
SizedBox(
height: 600,
width: double.infinity,
child: ValueListenableBuilder(
valueListenable: showList,
builder: (context, value, child) {
return value
? NotificationListener<ScrollNotification>(
onNotification: (details) {
if (details.metrics.pixels == details.metrics.maxScrollExtent) {
if (allowLoad) {
loadMore();
}
}
return true;
},
child: ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return RxImage.cacheNetwork(
url: items[index],
width: double.infinity,
fit: BoxFit.cover,
height: 300,
);
},
),
)
: const SizedBox.shrink();
},
),
),
],
),
floatingActionButton: FloatingActionButton.small(onPressed: () {
showList.value = !showList.value;
}),
);
}
void loadMore() async {
allowLoad = false;
await Future.delayed(const Duration(milliseconds: 750), () {
debugPrint("wait preload");
});
for (final url in urls) {
cacheManager.download(url: url);
}
setState(() {
items.addAll(urls);
});
}
}
const urls = [
"https://images.pexels.com/photos/19560944/pexels-photo-19560944.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2",
"https://images.pexels.com/photos/17889085/pexels-photo-17889085.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2",
"https://images.pexels.com/photos/19542480/pexels-photo-19542480.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2",
// 更多URL...
];
更多关于Flutter网络图片缓存与加载插件rxcache_network_image的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter网络图片缓存与加载插件rxcache_network_image的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter开发中,使用rxcache_network_image
插件可以高效地实现网络图片的缓存与加载。下面是一个详细的代码示例,展示如何集成并使用rxcache_network_image
。
步骤 1: 添加依赖
首先,在pubspec.yaml
文件中添加rxcache_network_image
依赖:
dependencies:
flutter:
sdk: flutter
rxcache_network_image: ^最新版本号 # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
步骤 2: 导入包
在你的Dart文件中导入rxcache_network_image
包:
import 'package:rxcache_network_image/rxcache_network_image.dart';
步骤 3: 使用RxCacheNetworkImage
下面是一个完整的示例,展示如何在Flutter应用中使用RxCacheNetworkImage
来加载和缓存网络图片。
import 'package:flutter/material.dart';
import 'package:rxcache_network_image/rxcache_network_image.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final String imageUrl = 'https://example.com/path/to/your/image.jpg';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('RxCacheNetworkImage Demo'),
),
body: Center(
child: RxCacheNetworkImage(
imageUrl,
placeholder: (context, url) => CircularProgressIndicator(),
errorWidget: (context, url, error) => Icon(Icons.error),
cacheConfig: CacheConfig(
maxAge: const Duration(days: 7), // 缓存有效期
maxCount: 100, // 最大缓存数量
),
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN', // 如果有需要添加的头信息
},
),
),
);
}
}
解释
- 依赖添加:确保在
pubspec.yaml
文件中添加了rxcache_network_image
依赖。 - 导入包:在Dart文件中导入
rxcache_network_image
。 - 使用RxCacheNetworkImage:
imageUrl
:要加载的图片的URL。placeholder
:在图片加载时显示的占位符,这里使用了一个CircularProgressIndicator
。errorWidget
:在图片加载失败时显示的错误组件,这里使用了一个错误图标。cacheConfig
:配置缓存策略,包括缓存的最大有效期和最大缓存数量。headers
:如果需要添加额外的HTTP头信息,可以在这里指定,例如用于身份验证的Bearer令牌。
通过上述步骤,你可以在Flutter应用中高效地加载和缓存网络图片。rxcache_network_image
插件会自动处理图片的缓存逻辑,减少不必要的网络请求,提升用户体验。