最近使用 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
现在因为知道怎么实现去复盘思路,看起来还好,实际颇费了些周折,应该是可以帮到有这样需求的人,免得再像我似的苦逼哈哈的研读源码,就这么多了。