最近把一个上周写的 Flutter Module 引入一个 Flutter 项目中作为依赖项,发现一个问题:原先在 Module 中带有文件资源的控件放到其它项目中显示不出来了。经过一番调试确定是打包和路径问题,当我们的项目依赖到另一个项目中的时候,其实类似于 images/xxx.jpg
这样的文件路径其实已经变了,因为 Flutter 的打包过程大致和 Android 是相似的,所有 packages 最终会合并,可能是 Flutter 并没有像 Android 那样的资源文件包名补齐的过程。
查了很多资料都找不到对应方案,又回头去官网文档里再仔细查一下,最终发现其实官网里写了(😣之前太粗心没认真看),先看一下官网文档里是怎么说的:
文档里说了两个很重要很重要的前提:
- 把资源文件夹放进
lib/
里的话,可以直接用,不需要在pubspec.yaml
中指定 - 如果要把资源文件打进 package 里给别的项目用,是必须要在
pubspec.yaml
里指定
现在的问题就是怎么指定路径以及怎么正确地引用到资源文件,文档里似乎没有明说但其实已经给出了对应方案:
把你的资源文件夹移到
lib/
里(通常我们是把这些文件放在项目根目录)-
使用特殊的路径规则:packages + 包名 + 文件相对路径,例如你的一个图片
abc.jpg
的完整路径是 flutter_ui/lib/images/2.0x/abc.jpg ,那在pubspec.yaml
中要写成flutter: assets: - packages/flutter_ui/images/abc.jpg
在
pubspec.yaml
中指定的资源路径其实相当于一个 key ,所以用的地方也要用同样的 key 才能找到 :Image.asset('packages/flutter_ui/images/abc.jpg');
可以看出有三个特殊的规则,一是前面要加一个关键字
packages
,二是lib
这个路径要忽略掉不写,三是要在文件名前加包名,lib
忽略可以理解,但是前面这个packages
关键字不是很懂,之后得抽空研究一下 Flutter 的打包流程。
总之是要好好看文档👻