Alejandro Serrano.Mena
07/12/2024, 8:17 PMNo ViewModelStoreOwner was provided via LocalViewModelStoreOwner
for context, I've added androidx.lifecycle:lifecycle-viewmodel-compose:2.8.3
as dependency, and also org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.8.1
Pablichjenkov
07/12/2024, 8:28 PMMarcin Wisniowski
08/05/2024, 4:45 PMNo ViewModelStoreOwner was provided via LocalViewModelStoreOwner
. I've read the docs here: https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-viewmodel.html
But I don't see anything I'm missing.Pablichjenkov
08/05/2024, 5:15 PMMarcin Wisniowski
08/05/2024, 5:25 PMCompose UI 1.7.0-alpha05
, but the latest version on desktop is alpha02
.Pablichjenkov
08/05/2024, 5:39 PMIvan Matkov
08/06/2024, 8:26 AMCompose UI 1.7.0-alpha05
, but the latest version on desktop is alpha02
.
We're aligning only first two numbers in version (like 1.7) with Google. Compose Multiplatform 1.7.0-alpha02 is based on Google's 1.7.0-beta05. It's mentioned in release notes.
But to make it work you don't need any alphas - combination with Compose 1.6.11 + Lifecycle 2.8.0 should work.
If you're facing with 336842920 on Android - update (2.8.4) lifecycle on Android only. Just add Google's dependency to you androidMain source set. It works because JB library redirects to Google's binary on Android
> similar to the one you linked
Mentioned issue is not related to initial topic (view model is missed, not lifecycle). It should be provided by Compose UI since 1.6.10. So my only guess is - you're using older version of Compose.Marcin Wisniowski
08/06/2024, 4:39 PM1.7.0-alpha2
org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.0
org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.0
org.jetbrains.androidx.navigation:navigation-compose:2.8.0-alpha08
And getting java.lang.IllegalStateException: CompositionLocal LocalLifecycleOwner not present
, just like in the issue I linked.Ivan Matkov
08/06/2024, 4:40 PMMarcin Wisniowski
08/06/2024, 4:40 PMIvan Matkov
08/06/2024, 4:41 PMMarcin Wisniowski
08/06/2024, 4:41 PM1.7.0-alpha02
Ivan Matkov
08/06/2024, 4:41 PMIvan Matkov
08/06/2024, 4:42 PMIvan Matkov
08/06/2024, 4:44 PMIvan Matkov
08/06/2024, 4:44 PMandroidx.compose.ui.platform.LocalLifecycleOwner
• androidx.lifecycle.compose.LocalLifecycleOwner
Which one do you use?Marcin Wisniowski
08/06/2024, 4:46 PMimport androidx.lifecycle.compose.LocalLifecycleOwner
, my understanding is that the org.jetbrains.androidx.lifecycle:lifecycle-*
packages expect androidx.compose.ui.platform.LocalLifecycleOwner
, which is the source of the error.Ivan Matkov
08/06/2024, 4:48 PMIvan Matkov
08/06/2024, 4:48 PMIvan Matkov
08/06/2024, 4:50 PMIvan Matkov
08/06/2024, 4:51 PMMarcin Wisniowski
08/06/2024, 4:51 PMMarcin Wisniowski
08/06/2024, 5:06 PMNavHost
composable has to be inside of a Window
.Ivan Matkov
08/06/2024, 5:09 PMIvan Matkov
08/06/2024, 5:10 PMIvan Matkov
08/06/2024, 5:10 PMMarcin Wisniowski
08/06/2024, 5:12 PMNavHost
and can see the ViewModel still works fine now that it's retrieved inside of a Window
.Marcin Wisniowski
08/06/2024, 5:17 PMIvan Matkov
08/06/2024, 5:18 PMIvan Matkov
08/06/2024, 5:21 PMprivate class ComposeViewModelStoreOwner: ViewModelStoreOwner {
override val viewModelStore: ViewModelStore = ViewModelStore()
fun dispose() { viewModelStore.clear() }
}
/**
* Return remembered [ViewModelStoreOwner] with the scope of current composable.
*/
@Composable
private fun rememberViewModelStoreOwner(): ViewModelStoreOwner {
val viewModelStoreOwner = remember { ComposeViewModelStoreOwner() }
DisposableEffect(viewModelStoreOwner) {
onDispose { viewModelStoreOwner.dispose() }
}
return viewModelStoreOwner
}
And set it via
CompositionLocalProvider(LocalViewModelStoreOwner provides owner)
Ivan Matkov
08/06/2024, 5:21 PMIvan Matkov
08/06/2024, 5:24 PMComposeViewModelStoreOwner
above should be more complicated for Android case - it needs to be backed up by system one to deal with their recreation stuff
Or just use it as fallback like
LocalViewModelStoreOwner.current ?: rememberViewModelStoreOwner()
Marcin Wisniowski
08/06/2024, 5:25 PMMarcin Wisniowski
08/08/2024, 7:48 PMIvan Matkov
08/09/2024, 11:50 AMMarcin Wisniowski
08/09/2024, 7:01 PM