Skip to content

Instantly share code, notes, and snippets.

@SaurabhSandav
Last active November 6, 2020 16:10
Show Gist options
  • Select an option

  • Save SaurabhSandav/8a776c0f0d8753108f86a040c5e338de to your computer and use it in GitHub Desktop.

Select an option

Save SaurabhSandav/8a776c0f0d8753108f86a040c5e338de to your computer and use it in GitHub Desktop.
Using Hilt injected ViewModels with Compose Navigation
// AppSavedStateViewModelFactory
typealias ViewModelAssistedFactoryMap = Map<String, @JvmSuppressWildcards Provider<ViewModelAssistedFactory<out ViewModel>>>
class AppSavedStateViewModelFactory(
owner: SavedStateRegistryOwner,
private val viewModelAssistedFactoryMap: ViewModelAssistedFactoryMap,
) : AbstractSavedStateViewModelFactory(owner, null) {
@Suppress("UNCHECKED_CAST")
@SuppressLint("RestrictedApi")
override fun <T : ViewModel?> create(
key: String,
modelClass: Class<T>,
handle: SavedStateHandle,
): T {
val viewModelAssistedFactory = viewModelAssistedFactoryMap[modelClass.name]?.get()
?: error("ViewModelAssistedFactory (${modelClass.name}) not found")
return viewModelAssistedFactory.create(handle) as T
}
}
// MainActivity
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var viewModelAssistedFactories: ViewModelAssistedFactoryMap
}
// NavHost
NavHost(navController, startDestination = start.name) {
composable(Screen.Main.name) {
MainScreen(rememberViewModelFactory(viewModelAssistedFactories))
}
}
@Composable
fun MainScreen(
viewModelFactory: ViewModelProvider.Factory,
) {
val viewModel = viewModel<MainViewModel>(factory = viewModelFactory)
}
@Composable
private fun rememberViewModelFactory(
viewModelAssistedFactories: ViewModelAssistedFactoryMap,
): AppSavedStateViewModelFactory {
val savedStateRegistryOwner = LifecycleOwnerAmbient.current as SavedStateRegistryOwner
return remember {
AppSavedStateViewModelFactory(savedStateRegistryOwner, viewModelAssistedFactories)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment