Flutter packageのassetsファイルにアクセスする方法を探していて、いろいろ試した結果をまとめておきます。
私の場合、そのパッケージ自身からアクセスする方法を知りたかったのですが、アプリ側からアクセスするのと同じで、
1. パッケージ側のpubspec.yamlに、 Specifying assets のとおり、ふつうにassetsファイルを記載する。
assets:
- foo/
ディレクトリ指定も問題ありません。
2. assetsファイルのpathに'packages/パッケージ名/'を付加する。
var text = await rootBundle.loadString('packages/パッケージ名/foo/bar.txt');
アプリ側からでも、パッケージ内からでも同様です。
3. アプリ側からアクセスするときも、アプリ側のpubspec.yamlへの記載は不要。
といった要領でOKです。
packageのlibディレクトリ下に置く方法もありましたが、試してみたところ、
- パッケージ側から自身のassetsファイルにアクセスする場合においても、アプリ側のpubspec.yamlに記載する必要がある。
- その際、ディレクトリ指定が効かないようで、アプリ側でパッケージのassetsファイルをいちいち列挙する必要がある。
となり、libディレクトリ下に置く利点があるようには思えませんでした。
package作者の意図の及ばないところで(意図に反して)、 アプリ側のpubspec.yamlへ記載して(勝手に)アクセスしたい、 というようなことはあるかも知れませんが、 その場合はlibディレクトリ下にないとアプリ側からは見えないので、 packageは最初からそのことを意識して実装しているともいえます。 であるならばassetsファイルとして自ら公開しておくのが本来あるべき姿のように思います。
参照
Bundle assets used in packages #11751
Including assets in a Flutter package
How to add assets in flutter Package/Plugin development?