最近把一个上周写的 Flutter Module 引入一个 Flutter 项目中作为依赖项,发现一个问题:原先在 Module 中带有文件资源的控件放到其它项目中显示不出来了。经过一番调试确定是打包和路径问题,当我们的项目依赖到另一个项目中的时候,其实类似于 images/xxx.jpg 这样的文件路径其实已经变了,因为 Flutter 的打包过程大致和 Android 是相似的,所有 packages 最终会合并,但是可能是 Flutter 并没有像 Android 那样的包名补齐的过程。

    查了很多资料都找不到对应方案,又回头去官网文档里再仔细查一下,最终发现其实官网里写了(😣之前太粗心没认真看),先看一下官网文档里是怎么说的:

    Flutter 依赖库的资源处理 - 图1

    文档里说了两个很重要很重要的前提:

    • 把资源文件夹放进 lib/ 里的话,可以直接用,不需要在 pubspec.yaml 中指定
    • 如果要把资源文件打进 package 里给别的项目用,必须要在 pubspec.yaml 里指定

    现在的问题就是怎么指定路径以及怎么正确地引用到资源文件,文档里似乎没有明说但其实已经暗示了对应方案:

    1. 把你的资源文件夹统统移到 lib/ 里(通常我们是把这些文件放在项目根目录)

    2. 使用特殊的路径规则:packages + 包名 + 文件相对路径,例如你的一个图片 abc.jpg 的完整路径是 flutter_ui/lib/images/2.0x/abc.jpg ,那在 pubspec.yaml 中要写成:

    1. flutter:
    2. assets:
    3. - packages/flutter_ui/images/abc.jpg

    pubspec.yaml 中指定的资源路径其实相当于一个 key ,所以用的地方也要用同样的 key 才能找到 :

    1. Image.asset('packages/flutter_ui/images/abc.jpg');

    可以看出有三个特殊的规则,一是前面要加一个关键字 packages ,二是 lib 这个路径要忽略掉不写,三是要在文件名前加包名,lib 忽略可以理解,但是前面这个 packages 关键字不是很懂,之后得抽空研究一下 Flutter 的打包流程。

    (要好好看文档呀,逃