
最近使用 flutter_svg 这个 package 加载 svg 图片:
https://github.com/dnfield/flutter_svg.git
一开始的使用还算顺利,直到遇到了一个需求,需要设置 Container 的 DecorationImage,但是 DecorationImage 的 image 参数需要一个 ImageProvider:
使用正常图片是没有问题的,但是如果能支持svg 的话岂不是很美,所以研究了一下 fluter_svg 这个 package,发现并没有提供相关的方法来调用,而且网上也没有相关的实现,那就只能自己动手,丰衣足食了。
先看看 ImageProvider 是个什么东东:
是个 abstract class ,似乎是个不错的信号,这意味着只要 extends ImageProvide 就可以作为参数传递进去了。那就先看看 Image 这个 Widget 是怎么实现的吧:
这个是 Image 其中一个构造函数,其中把 MemoryImage 赋值给了 image 这个参数,嗯,看看 这个 MemoryImage 是个什么东东吧:
哎呦不错哦,果然是 extends 的 ImageProvider,哈哈,那我们就按照这个仿造一个我们自己的 ImageProvider吧:
像注释里面说的,现在的问题变成了怎么将 svg asset 变成一个 uint8list ,貌似这个需要从 flutter_svg 这个 package 寻找答案了,看了下文档,果然不负众望:
这个似乎可以转变成一个 Image 这个 Image 是 dart:ui 的对象,继续看看它能做什么:
完美,所以思路很明朗了:
1,读取 svg 的内容;
2,调用 flutter_svg 提供的方法转变为 Picture;
3,将 Picture 转为 Image;
4,通过 Image 获取 ByteData;
5,将 ByteData 转为 Uint8List;_loadAsync 就可以实现了:
这样终于就可以实现我们想要的效果了:
完整代码可以查看
https://github.com/yang-f/flutter_svg_provider
现在因为知道怎么实现去复盘思路,看起来还好,实际颇费了些周折,应该是可以帮到有这样需求的人,免得再像我似的苦逼哈哈的研读源码,就这么多了。