Android: 公式でAssisted Injectがサポートされそう

Assisted Injectのコードが公式のDaggerに入ったそうです。

https://twitter.com/JakeWharton/status/1344055984575160321

まだリリースされていないんですが、軽く試してみました。

サンプルコード

初期値を受け取りたい Counterクラスがあるとして、それをAssistedを使って定義してみます。

class Counter @AssistedInject constructor(
  @Assisted private val initialValue: Int
) {
  val count = MutableStateFlow(initialValue)
}

@AssistedFactory
interface CounterFactory {
  fun create(initialValue: Int): Counter
}

これで定義は完了です。FactoryクラスをAssistedFactoryアノテーションで、本体をAssistedInjectAssistedアノテーションを使って定義します。 square/AssistedInject とは違い AssistedModule が必要なくなりました。

そして次のように使います。

@Inject lateinit var factory: CounterFactory

val counter = factory.create(100)
...

定義した CounterFactoryをinjectして、 Counterインスタンスを生成しています。こちらはいつものDaggerの記法になります。

まとめ

ついに公式にAssisted Injectionが入ります:D

サンプルコードは satoshun/daggersampleにあります。

Written by