From 426c4f4eb7adcaa8fd3cfd5d15361887c7a9910e Mon Sep 17 00:00:00 2001 From: Arnaud Giuliani Date: Tue, 5 Mar 2024 07:49:54 +0100 Subject: [PATCH] Add ViewModel scope warnings &. deprecate API where it can use scope directly --- docs/reference/koin-android/scope.md | 7 +++---- .../java/org/koin/android/compat/GetViewModelCompat.kt | 1 + .../main/java/org/koin/androidx/viewmodel/GetViewModel.kt | 2 +- .../koin/androidx/viewmodel/ext/android/ViewModelLazy.kt | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/reference/koin-android/scope.md b/docs/reference/koin-android/scope.md index 554bc4586..52b21a024 100644 --- a/docs/reference/koin-android/scope.md +++ b/docs/reference/koin-android/scope.md @@ -168,13 +168,12 @@ If you try to access Scope from `onDestroy()` function, scope will be already cl ViewModel is only created against root scope to avoid any leaking (leaking Activity or Fragment ...). This guard for the visibility problem, where ViewModel could have access to incompatible scopes. -:::note -If you ViewModel can't get access to a dependency, check in which scope it has been declared. +:::warn +ViewModel can't access to Activity or Fragment scope. Why? Because ViewModel is lasting long than Activity and Fragment, and then it would leak dependencies outside of proper scopes. ::: - :::note -If you _really_ need to bridge a dependency from outside a ViewModel scope, you can use "injected parameters" to pass some objects to your ViewModel. +If you _really_ need to bridge a dependency from outside a ViewModel scope, you can use "injected parameters" to pass some objects to your ViewModel: `viewModel { p -> }` ::: `ScopeViewModel` is a new class to help work on ViewModel scope. This handle ViewModel's scope creation, and provide `scope` property to allow inject with `by scope.inject()`: diff --git a/projects/android/koin-android-compat/src/main/java/org/koin/android/compat/GetViewModelCompat.kt b/projects/android/koin-android-compat/src/main/java/org/koin/android/compat/GetViewModelCompat.kt index 738e275bd..01dc06f0f 100644 --- a/projects/android/koin-android-compat/src/main/java/org/koin/android/compat/GetViewModelCompat.kt +++ b/projects/android/koin-android-compat/src/main/java/org/koin/android/compat/GetViewModelCompat.kt @@ -27,6 +27,7 @@ import org.koin.core.scope.Scope import kotlin.reflect.KClass @OptIn(KoinInternalApi::class) +@Deprecated("scope is not used for ViewModel creation. This will fallback to root scope.") @KoinInternalApi fun resolveViewModelCompat( vmClass: Class, diff --git a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/GetViewModel.kt b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/GetViewModel.kt index 2fbe5f51b..c5725d985 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/GetViewModel.kt +++ b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/GetViewModel.kt @@ -26,7 +26,7 @@ import kotlin.reflect.KClass * @param parameters - for instance building injection */ @KoinInternalApi -@Deprecated("scope is not used for ViewModel creation") +@Deprecated("scope is not used for ViewModel creation. This will fallback to root scope.") fun resolveViewModel( vmClass: KClass, viewModelStore: ViewModelStore, diff --git a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/ViewModelLazy.kt b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/ViewModelLazy.kt index 56350c0d2..f1619491a 100644 --- a/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/ViewModelLazy.kt +++ b/projects/android/koin-android/src/main/java/org/koin/androidx/viewmodel/ext/android/ViewModelLazy.kt @@ -68,6 +68,7 @@ fun Fragment.viewModelForClass( } @OptIn(KoinInternalApi::class) +@Deprecated("scope is not used for ViewModel creation. This will fallback to root scope.") @MainThread fun getLazyViewModelForClass( clazz: KClass,