图片缓存策略
- 默认缓存策略:Flutter 有默认的图片缓存机制,会在图片加载后将其缓存起来。下次加载相同的图片时,会优先从缓存中获取,避免重复加载和解码图片,从而节省内存和加载时间。例如,当在多个地方使用同一个
NetworkImage
加载网络图片时,Flutter 会自动处理缓存逻辑。
- 手动控制缓存:可以使用
ImageCache
类来手动管理图片缓存。ImageCache
提供了一些方法,如 evict
、evictAll
等。通过调用 evict
方法并传入对应的 ImageProvider
,可以从缓存中移除特定的图片;evictAll
则可以清除所有缓存的图片。这在某些场景下,如应用内存紧张或者用户切换主题需要重新加载不同样式图片时很有用。
减少内存占用方式
- 合理设置缓存大小:通过
ImageCache
的 maximumSize
属性可以设置缓存的最大大小(以字节为单位)。当缓存图片占用的内存接近这个最大值时,Flutter 会自动清理缓存,移除最近最少使用的图片,从而控制内存占用。例如:
import 'package:flutter/material.dart';
void main() {
// 设置图片缓存最大大小为 10MB
PaintingBinding.instance.imageCache.maximumSize = 10 * 1024 * 1024;
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Image.network('https://example.com/image.jpg'),
),
),
);
}
}
- 及时清理无用缓存:在不需要某些图片缓存时,及时调用
evict
或 evictAll
方法清理缓存。比如,当用户浏览图片列表,快速滑动列表导致大量图片被缓存,而当用户离开该页面时,可以调用 evictAll
方法清理缓存,释放内存。
import 'package:flutter/material.dart';
class MyPage extends StatefulWidget {
@override
_MyPageState createState() => _MyPageState();
}
class _MyPageState extends State<MyPage> {
@override
void dispose() {
// 页面销毁时清理图片缓存
PaintingBinding.instance.imageCache.evictAll();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: 100,
itemBuilder: (context, index) {
return Image.network('https://example.com/image_$index.jpg');
},
),
);
}
}