Skip to content

Instantly share code, notes, and snippets.

@Zellius
Created April 16, 2018 11:57
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 Zellius/dde2ccd331677e64c55658a49f2d9dcf to your computer and use it in GitHub Desktop.
Save Zellius/dde2ccd331677e64c55658a49f2d9dcf to your computer and use it in GitHub Desktop.
Android. Inject data from Activity Intent into ViewModel
import android.arch.lifecycle.ViewModel
import android.arch.lifecycle.ViewModelProvider
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentActivity
import android.support.v7.app.AppCompatActivity
import dagger.Module
import dagger.Provides
import dagger.android.support.DaggerAppCompatActivity
import javax.inject.Inject
//Base Factory for all ViewModels
private class DefaultViewModelFactory(private val viewModel: dagger.Lazy<out ViewModel>) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val initedViewModel = viewModel.get()
if (initedViewModel.javaClass.isAssignableFrom(modelClass)) {
return initedViewModel as T
} else {
throw IllegalArgumentException("ViewModel ${initedViewModel::class.java.name} is not assignable from requested model class ${modelClass.name}")
}
}
}
//Extension functions for simplify
fun FragmentActivity.getViewModelProvider(viewModel: dagger.Lazy<out ViewModel>): ViewModelProvider =
ViewModelProvider(this, DefaultViewModelFactory(viewModel))
fun Fragment.getViewModelProvider(viewModel: dagger.Lazy<out ViewModel>): ViewModelProvider =
ViewModelProvider(this, DefaultViewModelFactory(viewModel))
interface SampleViewModel {
fun someFun()
}
//ViewModel
class SampleViewModelImpl @Inject constructor(val entityId: Int) : ViewModel(), SampleViewModel{
override fun someFun() {
//Do something
}
}
@Module
class SampleModule {
@Provides
fun provideViewModel(
activity: SampleActivity,
viewModel: dagger.Lazy<SampleViewModelImpl>
): SampleViewModel =
activity.getViewModelProvider(viewModel).get(SampleViewModelImpl::class.java)
@Provides
fun provideEntityId(activity: SampleActivity) = SampleActivity.extractEntityId(activity)
}
class SampleActivity : DaggerAppCompatActivity() {
@Inject
lateinit var sampleViewModel: SampleViewModel
companion object {
private const val EXTRA_ENTITY_ID = "entity_id"
fun extractEntityId(sampleActivity: SampleActivity): Int =
sampleActivity.intent.getIntExtra(EXTRA_ENTITY_ID, -1)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment