ダガーとのviewmodelsを提供するために、1 ViewModelFactoryを使用する方法

デビッド:

どのように私は実装することができますViewModelFactory私のプロジェクトを提供するためにViewModels、それがプロジェクト全体の依存関係は?

coroutineDispatcher:

まあ、そこと呼ばれるものですGithubBrowserそしてそれは、それがプロジェクトのチュートリアルではありません。あなたはそれを行うには、Androidのための短剣を知っている必要があります。それとも、あなたは以下のコードをチェックすることがあります。

@Singleton
class DaggerViewModelFactory @Inject constructor(
    private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        val creator = creators[modelClass] ?: creators.entries.firstOrNull {
            modelClass.isAssignableFrom(it.key)
        }?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
        try {
            @Suppress("UNCHECKED_CAST")
            return creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
    }
}

この部分はあなたの全体のアプリのための「汎用」のviewmodelを作成します。このように、ViewModelasigned引数を使用して作成されます。その後、あなたのシングルトンモジュールに工場出荷時のモジュールを実装する必要があり、およびコンポーネントに、それを含みます。

@Component(
    modules = [... ViewModelModule::class]
)
interface AppCompoenent{}

今楽しい部分:

    @Suppress("unused")
    @Module
    abstract class ViewModelModule {
        @Binds
        @IntoMap
        @ViewModelKey(MyViewModel::class)
        abstract fun bindsMyViewModel(viewModel: MyViewModel): ViewModel

    @Binds
    abstract fun bindsViewModelFactory(factory: DaggerViewModelFactory): ViewModelProvider.Factory
}

あなたの多短剣サポートするので5月として結合して自由であるViewModelsあなたが望むよう。

ViewModelKey:

@Target(
    AnnotationTarget.FUNCTION,
    AnnotationTarget.PROPERTY_GETTER,
    AnnotationTarget.PROPERTY_SETTER
)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)

あなたは基本的にハッシュマップの値をputingています。これらの値は、あなたですViewModel

ヒットビルド!Done.Afterはあなただけ注入することをViewModelProvider.Facoryお使いのフラグメントに。あなたよりもViewModelあなたが行うことができます。

class MyViewModel @Inject constructor(
    private val dependency: YourDependency
) : ViewModel() {}

あなたがコメントに要求されたものを明確にするために。まず、内部で何が起こっているかを知るためには特定の必要はありませんDaggerViewModelFactory、私は「常に何が起こっているかを知ること」の強力なファンをしていますので、私はこの方法を学ぶことはお勧めしませんが、。FYI DaggerViewModelFactory受け入れるだけのクラスでMap拡張するすべてのクラスでのViewModel値としてキーとして、そのクラスの依存関係を。使用している場合Provider<T>ダガーは、それらの依存関係を見つける方法を知っていますが呼ばれるまで、まだ、あなたにそれらをもたらすものではありませんprovider.get()ただ遅延初期化と考えてください。

今すぐチェックmodelClass.isAssignableFrom(it.key)そのクラスが実際に拡張する場合、それだけでチェックViewModel

あなたの2番目の質問については、最初の部分を理解することが重要です。以来Dagger担体は多、その手段は、あなたが使用して依存関係を提供できることMap<Key, Value>例えば、Map<HomeViewModel, Provider<ViewModel>>基本的に私を与える短剣教えてくれるHomeViewModelの依存関係を。どのようにしているかを知るために:ダガーが言おうとしているHomeViewModel依存関係は?そして、あなたは応答:私はすでにそのためのキーを定義しているし、それはだHomeViewModelクラス自体。あなただけの注釈を作成するので、とそれを組み合わせる@Binds@IntoMap、背景にダガーだけで実行されますmap.put(HomeViewModel::class, AndDependencies)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=231170&siteId=1