最近把一個上周寫的 Flutter Module 引入一個 Flutter 項目中作為依賴項,發現一個問題:原先在 Module 中帶有文件資源的控件放到其它項目中顯示不出來了。經過一番調試確定是打包和路徑問題,當我們的項目依賴到另一個項目中的時候,其實類似于 images/xxx.jpg
這樣的文件路徑其實已經變了,因為 Flutter 的打包過程大致和 Android 是相似的,所有 packages 最終會合并,可能是 Flutter 并沒有像 Android 那樣的資源文件包名補齊的過程。
查了很多資料都找不到對應方案,又回頭去官網文檔里再仔細查一下,最終發現其實官網里寫了(??之前太粗心沒認真看),先看一下官網文檔里是怎么說的:
截屏2019-11-22下午2.01.37.png
文檔里說了兩個很重要很重要的前提:
- 把資源文件夾放進
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 的打包流程。
總之是要好好看文檔??