brandonmcansh
10/24/2023, 3:18 PMbrandonmcansh
10/24/2023, 7:33 PM@Composable
inline fun <reified T : ScreenModel> Screen.screenViewModel(
crossinline factory: @DisallowComposableCalls () -> T = {
with (ViewModelComponent::class.create()) {
getViewModel<T>()
} as T
}
): T = this.rememberScreenModel(tag = T::class.qualifiedName) { factory() }
with ViewModelComponent being:
@Component
abstract class ViewModelComponent: AppComponent() {
abstract val loginViewModel: LoginViewModel
abstract val homeViewModel: HomeViewModel
inline fun <reified T: ScreenModel> getViewModel(): ScreenModel {
return when (val clazz = T::class) {
LoginViewModel::class -> loginViewModel
HomeViewModel::class -> homeViewModel
else -> throw NoSuchElementException("No viewModel found for ${clazz.simpleName}")
}
}
}
brandonmcansh
10/24/2023, 7:33 PMbrandonmcansh
10/24/2023, 7:33 PM@Composable
private fun Screens.Home.Content(
modifier: Modifier = Modifier,
viewModel: HomeViewModel = screenViewModel()
) {
dorche
10/27/2023, 10:54 AMrememberScreenModel
do? I've done something similar but no remember calls (mainly because Hilt didn't seem to use remember)
@Composable
inline fun <reified VM : ViewModel, reified F: ViewModelFactory<VM>> kotlinInjectViewModel(
factory: (ApplicationComponent) -> F,
viewModelStoreOwner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
"No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
},
): VM {
val context = LocalContext.current
val component = factory(context.applicationComponent)
return viewModel(
viewModelStoreOwner = viewModelStoreOwner,
factory = component.factory()
)
}
brandonmcansh
10/27/2023, 11:23 AM@Composable
public inline fun <reified T : ScreenModel> Screen.rememberScreenModel(
tag: String? = null,
crossinline factory: @DisallowComposableCalls () -> T
): T =
remember(ScreenModelStore.getKey<T>(this, tag)) {
ScreenModelStore.getOrPut(this, tag, factory)
}
brandonmcansh
10/27/2023, 11:23 AMbrandonmcansh
10/27/2023, 11:49 AM