Skip to content

Instantly share code, notes, and snippets.

@guitcastro
Last active April 23, 2018 20:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save guitcastro/a88f206ef37a124d280ad9bccbe03446 to your computer and use it in GitHub Desktop.
Save guitcastro/a88f206ef37a124d280ad9bccbe03446 to your computer and use it in GitHub Desktop.
KodeIn ViewModelModules
val kodeIn = Kodein.lazy {
import(viewModelProvidersModule(vmModules))
}
val vmModules = Kodein.Module {
bind<FooViewModel>() with provider { FooViewModel(instance()) }
}
import android.arch.lifecycle.ViewModel
import android.arch.lifecycle.ViewModelProvider
import android.arch.lifecycle.ViewModelProviders
import android.support.v7.app.AppCompatActivity
import org.kodein.di.Kodein
import org.kodein.di.TT
import org.kodein.di.bindings.subTypes
import org.kodein.di.direct
import org.kodein.di.generic.*
import org.kodein.di.jvmType
fun viewModelProvidersModule(viewModelModule: Kodein) = Kodein.Module {
bind<ViewModelProvider>() with contexted<AppCompatActivity>().provider {
ViewModelProviders.of(context, KodeinViewModelProviderFactory(viewModelModule))
}
bind<ViewModel>().subTypes() with { type ->
@Suppress("UNCHECKED_CAST")
provider {
instance<ViewModelProvider>().get(type.jvmType as Class<ViewModel>)
}
}
}
class KodeinViewModelProviderFactory(private val kodein: Kodein) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
val vm = kodein.direct.Instance(TT(modelClass as Class<*>))
return modelClass.cast(vm)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment