❗주의
이 Extension은 Hilt DI 라이브러리 사용과 Activity 또는 Fragment에 @AndroidEntryPoint 어노테이션이 선언되어 있는 경우 유용하게 사용 가능합니다.
import android.app.Activity
import android.content.Context
import android.content.ContextWrapper
import android.view.View
import androidx.activity.ComponentActivity
import androidx.annotation.MainThread
import androidx.lifecycle.HasDefaultViewModelProviderFactory
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelLazy
import androidx.lifecycle.ViewModelProvider.Factory
import androidx.lifecycle.ViewModelStoreOwner
import androidx.lifecycle.findViewTreeViewModelStoreOwner
import androidx.lifecycle.viewmodel.CreationExtras
fun Context.findActivity(): Activity {
var context = this
while (context is ContextWrapper && context !is Activity) {
context = context.baseContext
}
return context as Activity
}
@MainThread
inline fun <reified VM : ViewModel> View.viewModels(
noinline ownerProducer: () -> ViewModelStoreOwner = { findViewTreeViewModelStoreOwner()!! },
noinline extrasProducer: (() -> CreationExtras)? = null,
noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM> {
val owner by lazy(LazyThreadSafetyMode.NONE) { ownerProducer() }
return ViewModelLazy(
VM::class,
{ owner.viewModelStore },
factoryProducer ?: {
(owner as HasDefaultViewModelProviderFactory).defaultViewModelProviderFactory
},
{
extrasProducer?.invoke()
?: (owner as? HasDefaultViewModelProviderFactory)?.defaultViewModelCreationExtras
?: CreationExtras.Empty
},
)
}
@MainThread
inline fun <reified VM : ViewModel> View.activityViewModels(
noinline extrasProducer: (() -> CreationExtras)? = null,
noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM> {
val owner by lazy(LazyThreadSafetyMode.NONE) { context.findActivity() as ComponentActivity }
return ViewModelLazy(
VM::class,
{ owner.viewModelStore },
factoryProducer ?: {
(owner as HasDefaultViewModelProviderFactory).defaultViewModelProviderFactory
},
{
extrasProducer?.invoke()
?: (owner as? HasDefaultViewModelProviderFactory)?.defaultViewModelCreationExtras
?: CreationExtras.Empty
},
)
}'Android' 카테고리의 다른 글
| [Android] Clickable RecyclerView StickyHeader (2) | 2025.06.05 |
|---|---|
| [Android] Lifecycle-aware BroadcastReceiver 구현하기 (0) | 2025.05.19 |
| [Android] FlexboxLayout 초과된 줄 숨김 처리 Extension (0) | 2025.04.04 |
| [Android] Jetpack Compose Radar Chart (1) | 2024.10.16 |
| [Android] Compose Scrollable Column에서 처음 보여지는 타이밍 캐치하기 (0) | 2024.07.05 |