Skip to content

Commit 3c5febe

Browse files
authored
Initialize local ViewModelStoreOwner in NavHost as fallback instead of providing default GlobalViewModelStoreOwner (#1235)
## Proposed Changes - Revert default value of `LocalViewModelStoreOwner` - it's `null` again instead of `GlobalViewModelStoreOwner` - Use local `ViewModelStoreOwner` in `NavHost` if `LocalViewModelStoreOwner` is empty ## Testing Test: try mpp sample
1 parent 4aed5ab commit 3c5febe

File tree

2 files changed

+23
-10
lines changed
  • lifecycle/lifecycle-viewmodel-compose/src/jbMain/kotlin/androidx/lifecycle/viewmodel/compose

2 files changed

+23
-10
lines changed

lifecycle/lifecycle-viewmodel-compose/src/jbMain/kotlin/androidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner.jb.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,7 @@
1717
package androidx.lifecycle.viewmodel.compose
1818

1919
import androidx.compose.runtime.Composable
20-
import androidx.lifecycle.ViewModelStore
2120
import androidx.lifecycle.ViewModelStoreOwner
2221

23-
private object GlobalViewModelStoreOwner: ViewModelStoreOwner {
24-
override val viewModelStore: ViewModelStore = ViewModelStore()
25-
}
26-
2722
@Composable
28-
internal actual fun findViewModelStoreOwner(): ViewModelStoreOwner? =
29-
GlobalViewModelStoreOwner
23+
internal actual fun findViewModelStoreOwner(): ViewModelStoreOwner? = null

navigation/navigation-compose/src/commonMain/kotlin/androidx/navigation/compose/NavHost.kt

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ import androidx.compose.runtime.setValue
4141
import androidx.compose.ui.Alignment
4242
import androidx.compose.ui.Modifier
4343
import androidx.compose.ui.platform.LocalLifecycleOwner
44+
import androidx.lifecycle.ViewModelStore
45+
import androidx.lifecycle.ViewModelStoreOwner
4446
import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
4547
import androidx.navigation.NavBackStackEntry
4648
import androidx.navigation.NavDestination
@@ -53,6 +55,25 @@ import androidx.navigation.createGraph
5355
import androidx.navigation.get
5456
import kotlin.jvm.JvmSuppressWildcards
5557

58+
private class ComposeViewModelStoreOwner: ViewModelStoreOwner {
59+
override val viewModelStore: ViewModelStore = ViewModelStore()
60+
fun dispose() { viewModelStore.clear() }
61+
}
62+
63+
/**
64+
* Return remembered [ViewModelStoreOwner] with the scope of current composable.
65+
*
66+
* TODO: Consider to move it to `lifecycle-viewmodel-compose` and upstream this to AOSP.
67+
*/
68+
@Composable
69+
private fun rememberViewModelStoreOwner(): ViewModelStoreOwner {
70+
val viewModelStoreOwner = remember { ComposeViewModelStoreOwner() }
71+
DisposableEffect(viewModelStoreOwner) {
72+
onDispose { viewModelStoreOwner.dispose() }
73+
}
74+
return viewModelStoreOwner
75+
}
76+
5677
/**
5778
* Provides in place in the Compose hierarchy for self contained navigation to occur.
5879
*
@@ -308,9 +329,7 @@ public fun NavHost(
308329
) {
309330

310331
val lifecycleOwner = LocalLifecycleOwner.current
311-
val viewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
312-
"NavHost requires a ViewModelStoreOwner to be provided via LocalViewModelStoreOwner"
313-
}
332+
val viewModelStoreOwner = LocalViewModelStoreOwner.current ?: rememberViewModelStoreOwner()
314333

315334
navController.setViewModelStore(viewModelStoreOwner.viewModelStore)
316335

0 commit comments

Comments
 (0)