以前書いたこの記事
の中で、
最初はViewStatesに入れれば一方向のフローになるかなと思ってやってみたんだけどkaptがメッセージ無しの謎のエラーを吐いてこれを解決できなかったので断念した
というようなことを書いた。今回はこれを解決したのでその顛末を書く。
ここで困っていることをもう少しだけ詳しく説明すると、NavControllerを持っているNavigationDelegateクラスをViewStatesに注入したくてそのようにコードを書いたら、daggerがコード生成をやっている最中に謎のエラーを吐いてうまくいかなかった、という感じ。エラーメッセージはタスクの実行時にstacktraceオプションを付けなければ見ることができなかったし、スタックトレースをさかのぼった先にあるエラーメッセージに
java.lang.IllegalArgumentException: no expression found for BindingRequest...
と書いてあってもどこがどう悪いのかさっぱり分からんので詰んだと思っていた。しかしながら詰んだといっても投げ出すのも癪なので、依存関係のグラフを描いてくれてそのうえダメなところを図示してくれるツールとか無いんだろうかと探してみたところ、scabbardというツールを見つけた。
ダメなところを教えてくれるというのは無理なようだが*1、グラフをインタラクティブなSVGで出力してくれるというもの*2で、依存関係の全体像をつかむのにすごく役立った。
私のケースでは、ビルドは失敗しているものの図の出力はなぜかできていたので、コードを少しいじってはビルドして図を眺めるというのをしばらく繰り返した。そんなことをやっているうちに、あるコンテキストでは注入しているオブジェクトが、また別のコンテキストでは注入できていないということに気が付いて雑にprovide関数を実装したところビルドが通るようになった。図で描くとこんな感じ。
これでめでたく依存関係を整理できたので、当初目指していた構造になった。
その時のクソデカPRくん: https://github.com/akihito104/UdonRoad2/pull/88
引き続き実装を進めていく。