@@ -9,8 +9,10 @@ import androidx.lifecycle.ViewModel
99import androidx.lifecycle.ViewModelProvider
1010import androidx.lifecycle.ViewModelStore
1111import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
12+ import cafe.adriel.voyager.core.annotation.ExperimentalVoyagerApi
1213import cafe.adriel.voyager.core.screen.Screen
1314import cafe.adriel.voyager.hilt.internal.componentActivity
15+ import dagger.hilt.android.lifecycle.withCreationCallback
1416
1517/* *
1618 * A function to provide a [dagger.hilt.android.lifecycle.HiltViewModel] managed by voyager ViewModelLifecycleOwner
@@ -50,3 +52,51 @@ public inline fun <reified T : ViewModel> Screen.getViewModel(
5052 provider[T ::class .java]
5153 }
5254}
55+
56+ /* *
57+ * A function to provide a [dagger.hilt.android.lifecycle.HiltViewModel] managed by Voyager ViewModelLifecycleOwner
58+ * instead of using Activity ViewModelLifecycleOwner.
59+ * There is compatibility with Activity ViewModelLifecycleOwner too but it must be avoided because your ViewModels
60+ * will be cleared when activity is totally destroyed only.
61+ *
62+ * @param viewModelProviderFactory A custom factory commonly used with Assisted Injection
63+ * @param viewModelFactory A custom factory to assist with creation of ViewModels
64+ * @return A new instance of [ViewModel] or the existent instance in the [ViewModelStore]
65+ */
66+ @Composable
67+ @ExperimentalVoyagerApi
68+ public inline fun <reified VM : ViewModel , F > Screen.getViewModel (
69+ viewModelProviderFactory : ViewModelProvider .Factory ? = null,
70+ noinline viewModelFactory : (F ) -> VM
71+ ): VM {
72+ val context = LocalContext .current
73+ val lifecycleOwner = LocalLifecycleOwner .current
74+ val viewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner .current) {
75+ " No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
76+ }
77+ return remember(key1 = VM ::class ) {
78+ val hasDefaultViewModelProviderFactory = requireNotNull(lifecycleOwner as ? HasDefaultViewModelProviderFactory ) {
79+ " $lifecycleOwner is not a androidx.lifecycle.HasDefaultViewModelProviderFactory"
80+ }
81+ val viewModelStore = requireNotNull(viewModelStoreOwner?.viewModelStore) {
82+ " $viewModelStoreOwner is null or have a null viewModelStore"
83+ }
84+
85+ val creationExtras = hasDefaultViewModelProviderFactory.defaultViewModelCreationExtras
86+ .withCreationCallback(viewModelFactory)
87+
88+ val factory = VoyagerHiltViewModelFactories .getVoyagerFactory(
89+ activity = context.componentActivity,
90+ delegateFactory = viewModelProviderFactory
91+ ? : hasDefaultViewModelProviderFactory.defaultViewModelProviderFactory
92+ )
93+
94+ val provider = ViewModelProvider (
95+ store = viewModelStore,
96+ factory = factory,
97+ defaultCreationExtras = creationExtras
98+ )
99+
100+ provider[VM ::class .java]
101+ }
102+ }
0 commit comments