fresh digitable

めんどくさかったなってことを振り返ったり振り返らなかったりするための記録

fluxとかMVIみたいな構造のアプリを作ってみたかった その2

以前書いたこの記事

akihito104.hatenablog.com

の中で、

最初はViewStatesに入れれば一方向のフローになるかなと思ってやってみたんだけどkaptがメッセージ無しの謎のエラーを吐いてこれを解決できなかったので断念した

というようなことを書いた。今回はこれを解決したのでその顛末を書く。

ここで困っていることをもう少しだけ詳しく説明すると、NavControllerを持っているNavigationDelegateクラスをViewStatesに注入したくてそのようにコードを書いたら、daggerがコード生成をやっている最中に謎のエラーを吐いてうまくいかなかった、という感じ。エラーメッセージはタスクの実行時にstacktraceオプションを付けなければ見ることができなかったし、スタックトレースをさかのぼった先にあるエラーメッセージに

java.lang.IllegalArgumentException: no expression found for BindingRequest...

と書いてあってもどこがどう悪いのかさっぱり分からんので詰んだと思っていた。しかしながら詰んだといっても投げ出すのも癪なので、依存関係のグラフを描いてくれてそのうえダメなところを図示してくれるツールとか無いんだろうかと探してみたところ、scabbardというツールを見つけた。

arunkumar9t2.github.io

ダメなところを教えてくれるというのは無理なようだが*1、グラフをインタラクティブSVGで出力してくれるというもの*2で、依存関係の全体像をつかむのにすごく役立った。

私のケースでは、ビルドは失敗しているものの図の出力はなぜかできていたので、コードを少しいじってはビルドして図を眺めるというのをしばらく繰り返した。そんなことをやっているうちに、あるコンテキストでは注入しているオブジェクトが、また別のコンテキストでは注入できていないということに気が付いて雑にprovide関数を実装したところビルドが通るようになった。図で描くとこんな感じ。

scabbardによる依存グラフ。右側のコンポーネントからは注入できていたが左側からはできていなかったのでビルドが通らなかった
scabbardによる依存グラフ。右側のコンポーネントからは注入できていたが左側からはできていなかったのでビルドが通らなかった

これでめでたく依存関係を整理できたので、当初目指していた構造になった。

https://user-images.githubusercontent.com/9658489/91858210-d8d6c680-eca3-11ea-802f-bb4a9e01ce2a.png

その時のクソデカPRくん: https://github.com/akihito104/UdonRoad2/pull/88

引き続き実装を進めていく。

追記: akihito104.hatenablog.com

*1:コンパイルが通らなかったら図が出力されない

*2:図中のコンポーネントをクリックするとそのコンポーネント内の依存グラフを見ることができる