Created
April 16, 2018 11:57
-
-
Save Zellius/dde2ccd331677e64c55658a49f2d9dcf to your computer and use it in GitHub Desktop.
Android. Inject data from Activity Intent into ViewModel
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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