😸

BindingAdapterでHiltのインスタンスを取得する

2022/08/07に公開

概要

DataBindingのBindingAdapterのメソッドから、
Hiltで管理しているインスタンスを取得する方法です。

取得方法

EntryPointを作成して、
BindingAdapterのメソッド上からEntryPointで取得するようにします。
metaCache, accountStoreには利用したいインスタンスのクラスを指定するようにします。

@EntryPoint
@InstallIn(SingletonComponent::class)
internal interface ReactionViewHelperProvider {
    fun metaCache(): MetaCache
    fun accountStore(): AccountStore
}

BindingAdapterから上記のEntryPointを取得して、EntryPoint経由で必要なインスタンスを取得します。

object ReactionBindingAdapter {
    @JvmStatic
    @BindingAdapter("avatarIcon", "url")
    ImageView.setReactionIcon(reactionType: String) {
        val entryPoint = EntryPointAccessors.fromApplication(context.applicationContext, ReactionViewHelperProvider::class.java)
	val metaCache = entryPoint.metaCache()
	val reaction = metaCache.get(reactionType)
    }
}

まとめ

そもそも、BindingAdapter上でHiltのインスタンスが必要になるほどの処理を実行すること自体が間違っている可能性が高いですが、
EntryPontを使用することによって、Hilt上で管理しているインスタンスを取得することができます。

参考にしたリンク

https://developer.android.com/training/dependency-injection/hilt-android?hl=ja

Discussion