如何预缓存SVG图标列表?使用flutter_svg遇预缓存问题求助
解决flutter_svg无预缓存功能的方案
flutter_svg本身确实没有内置的预缓存API,但可以通过以下两种方式实现SVG资源的预加载缓存:
方法一:内存缓存SVG字符串(推荐)
通过提前加载所有SVG资源的字符串内容并存入内存,后续直接使用字符串渲染SVG,避免重复读取本地文件。
1. 创建SVG缓存工具类
import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; class SvgCache { static final Map<String, String> _svgCache = {}; // 批量预缓存指定的SVG资源 static Future<void> precacheAssets(List<String> assetPaths) async { for (final path in assetPaths) { if (!_svgCache.containsKey(path)) { final svgContent = await rootBundle.loadString(path); _svgCache[path] = svgContent; } } } // 从缓存获取并渲染SVG static SvgPicture getCachedSvg( String assetPath, { double? width, double? height, Color? color, }) { final svgContent = _svgCache[assetPath]; if (svgContent != null) { return SvgPicture.string( svgContent, width: width, height: height, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, ); } // 缓存未命中时,降级为直接加载资源(避免崩溃) return SvgPicture.asset( assetPath, width: width, height: height, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, ); } }
2. 在App启动时预缓存所有资源
在main函数中初始化时完成预加载:
import 'package:flutter/material.dart'; void main() async { // 确保Flutter绑定初始化完成 WidgetsFlutterBinding.ensureInitialized(); // 预缓存你定义的所有SVG资源 await SvgCache.precacheAssets(Images.svgAssets); runApp(const MyApp()); }
3. 在UI中使用缓存的SVG
替换原来的SvgPicture.asset为缓存工具类的方法:
SvgCache.getCachedSvg(Images.MAIL_ICON, width: 24, height: 24, color: Colors.grey)
方法二:磁盘缓存(适合大量SVG资源场景)
如果你的App有大量SVG资源,担心内存占用过高,可以将SVG内容缓存到本地磁盘,下次启动时直接读取磁盘文件:
核心思路
- 使用
path_provider获取应用的缓存目录 - 预加载SVG时,将字符串内容写入缓存目录的对应文件
- 渲染时优先读取磁盘缓存文件,不存在再从assets加载并写入缓存
注意:这种方式需要额外处理文件读写的异常,以及缓存过期逻辑,适合资源量较大的场景。
内容的提问来源于stack exchange,提问作者faizan Muzamal
相关产品推荐
相关产品推荐

