使用Dagger 2提供airbnb / MvRx ViewModel类

时间:2018-12-19 19:41:47

标签: android viewmodel rx-java2 dagger-2 airbnb

我想为Dagger 2提供BaseMvRxViewModel类。如何为此设置ViewModel Factory和dagger模块?

我当时用Dagger 2向ViewModel类提供了

ViewModelModule.kt

@Module
abstract class ViewModelModule {
    @Binds
    abstract fun bindViewModelFactory(factory: ViewModelFactory): 
    ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(LevelsViewModel::class)
    abstract fun bindLevelsViewModel(viewModel: LevelsViewModel): 
ViewModel
}

ViewModelKey.kt

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

ViewModelFactory.kt

@Singleton
class ViewModelFactory @Inject constructor(private val creators: Map<Class<out ViewModel>,
    @JvmSuppressWildcards Provider<ViewModel>>) : ViewModelProvider.Factory {

    @Suppress("UNCHECKED_CAST")
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        val creator = creators[modelClass] ?:
        creators.asIterable().firstOrNull { 
            modelClass.isAssignableFrom(it.key) }?.value
            ?: throw IllegalArgumentException("unknown model class 
        $modelClass")

        return try {
            creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
    }
}

LevelsFragment.kt

override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
{
    super.onViewCreated(view, savedInstanceState)
    viewModel = ViewModelProviders.of(activity, viewModelFactory)
    .get(LevelsViewModel::class.java)
}

0 个答案:

没有答案