どのように私は実装することができますViewModelFactory
私のプロジェクトを提供するためにViewModels
、それがプロジェクト全体の依存関係は?
まあ、そこと呼ばれるものです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を作成します。このように、ViewModel
asigned引数を使用して作成されます。その後、あなたのシングルトンモジュールに工場出荷時のモジュールを実装する必要があり、およびコンポーネントに、それを含みます。
@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)
。