Dagger2は最初は難解だ・・・
Web業界でJava(Kotlin)でDIしようと思ったらSpringが有名だと思います。
自分も昔Spring(SpringBoot)を使っていたのでDIはなんとなくわかっていたのですが、それでもDagger2は難解でした。
AndroidでDIをしようと思ったらDagger2かKoinが有名かと思います。
自分は基本的にはDagger2を使っています。
Googleが公開しているAndroidのサンプルプロジェクトでもDagger2が使われていることが多いです。
そしてDagger2は最初はとっつきにくいです。
初めて導入するときは参考ページの通りに書いているのにコンパイルエラーが発生したりと何が原因でエラーが発生しているのかよくわからないことになったりもします。
最近はエラーメッセージもかなり改善されているような気がします。
簡単なサンプル
そこでDagger2を初めて使おうとしている人向けに非常に簡単なサンプルを作成しました。
android-dagger2-example
以下のような人に参考にしていただければと思います。
- Dagger2の導入がうまく行えない
- ViewModelとDagger2の連携方法がわからない
- SquareのAssistedInjectを導入したいが何をどうすればよいのかわからない
特にリストページから詳細ページに遷移するときに詳細ページのViewModelにIDみたいな情報を渡したいときがあります。
このIDはDaggerで管理しているわけではないので、どうやってViewModelに渡すのかと考えることがあると思います。
DaggerでViewModel生成を行うときにDaggerが管理していない値を渡すのが非常にしんどいのですが、この課題をAssistedInjectを使って解決しています。
// Fragment
private val args: DetailFragmentArgs by navArgs()
private val viewModel: DetailViewModel by assistedViewModels { factory.create(args.name) }
// ViewModel
class DetailViewModel @AssistedInject constructor(
@Assisted name: String,
app: App
) : AndroidViewModel(app) {}
Navigation ComponentのSafeArgsでFragmentにタイプセーフな引数を渡してViewModelにタイプセーフに不変な値を渡せます
最近はこの書き方を良くしていますが、FragmentとViewModel間が型と不変に守られる良い世界になったなーと思います。
あとできればDagger2でViewModelFactoryの取り扱いをサポートしてくれたらさらによくなるのにと思っております。
改善点
今思ったらModuleを使っていないのでViewModelに何かインジェクトするようにしたいと思います。
- Moduleを追加する
- Dagger2を2.26にアップデートする