flutter 如何从SVG字符串预缓存SVG图像?

brccelvz  于 2023-02-09  发布在  Flutter
关注(0)|答案(2)|浏览(196)

我已经在使用flutter_svg库中的precachePicture函数来加载svg资产:

Future<void> loadPictures() async {
  await precachePicture(
    ExactAssetPicture(SvgPicture.svgStringDecoder, 'assets/graphic/two_people.svg'),
    context,
  ); 
}

然而,我有一些原始的svg字符串(比这个更复杂),需要预先缓存太多

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 240"><polygon points="120 8.9 147.31 93.45 236.99 93.45 164.41 146.38 191.77 231.09 120 178.76 48.23 231.09 75.59 146.37 3.01 93.45 92.69 93.45 120 8.9" fill="#f8d64e"/></svg>

如何从SVG字符串预缓存SVG图像?

bsxbgnwa

bsxbgnwa1#

所以,我终于找到了解决办法:

svgString = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 240"><polygon points="120 8.9 147.31 93.45 236.99 93.45 164.41 146.38 191.77 231.09 120 178.76 48.23 231.09 75.59 146.37 3.01 93.45 92.69 93.45 120 8.9" fill="#f8d64e"/></svg>';

Future<void> loadSvgPictureFromSvgString() async {
  await precachePicture(
            StringPicture(SvgPicture.svgStringDecoder, svgString), context); //context or null
}

现在,当您调用SvgPicture.string(svgString)时,图像已经被预缓存,因此如果svgString有点复杂,渲染不会延迟。

doinxwow

doinxwow2#

flutter_svg中删除了2.x precachePicture
现在你必须这样预加载:

final SvgAssetLoader loader = SvgAssetLoader('assets/mypicture.svg');
 await svg.cache.putIfAbsent(loader.cacheKey(null), () => loader.loadBytes(null));

我在加载屏幕中围绕所有SVG图像构建了一个循环:

for (String image in Assets.svgImages.values) {
     final SvgAssetLoader loader = SvgAssetLoader(image);
     await svg.cache.putIfAbsent(loader.cacheKey(null), () => loader.loadBytes(null));
}

Assets.svgImages.values是使用flutter_gen生成的List<String>,包含资产文件夹中的所有SVG文件路径:-)

相关问题