Skip to content

Instantly share code, notes, and snippets.

@iruizmar
Last active October 29, 2021 07:34
Show Gist options
  • Select an option

  • Save iruizmar/e15c89e6cbe868f3633facbd4cd313cc to your computer and use it in GitHub Desktop.

Select an option

Save iruizmar/e15c89e6cbe868f3633facbd4cd313cc to your computer and use it in GitHub Desktop.
Koin Composable nav graph viewmodel API proposal
//A new viewmodel would be provided each time this destination is met in the graph
//Passing the backStackEntry is actually optional because it will be the LocalViewModelStoreOwner
private fun NavGraphBuilder.viewModelToEntry() {
composable(route = "route") { backStackEntry ->
Screen(
viewModel = getViewModel(backStackEntry)
)
}
}
//A ViewModel instance will be shared between two screens by scoping it to a parent's route
//The ViewModel will be recycled when the navgraph exits this subgraph.
private fun NavGraphBuilder.viewModelToSubGraph(navController: NavController){
val parentRoute = "parent"
val childARoute = "childA"
val childBRoute = "childB"
navigation(route = parentRoute, startDestination = childARoute) {
val viewModel = getViewModel()
composable(route = childARoute) {
val parentEntry = remember {
navController.getBackStackEntry(parentRoute)
}
ScreenA(
viewModel = getViewModel(parentEntry)
)
}
composable(route = childBRoute) {
val parentEntry = remember {
navController.getBackStackEntry(parentRoute)
}
ScreenB(
viewModel = getViewModel(parentEntry)
)
}
}
}
@OptIn(KoinInternalApi::class)
@Composable
inline fun <reified T : ViewModel> getViewModel(
viewModelStoreOwner: ViewModelStoreOwner = LocalViewModelStoreOwner.current!!,
qualifier: Qualifier? = null,
scope: Scope = GlobalContext.get().scopeRegistry.rootScope,
noinline parameters: ParametersDefinition? = null,
): T {
return remember(qualifier, parameters) {
scope.getViewModel(qualifier, {
ViewModelOwner.from(viewModelStoreOwner)
}, parameters)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment