包体积
- 不用 data class ,用普通的 class
- 自定义 ViewModel 的 lazy 实现?待验证
自定义 ViewModel 的 Lazy
@MainThread
inline fun <reified VM : ViewModel> Fragment.defaultActivityViewModels(
): Lazy<VM> = DefaultFragmentViewModelLazy(
VM::class,this,needRequestActivity = true
)
class DefaultFragmentViewModelLazy<VM : ViewModel> (
private val viewModelClass: KClass<VM>,
private val fragment: Fragment,
private val needRequestActivity: Boolean = false
) : Lazy<VM> {
private var cached: VM? = null
override val value: VM
get() {
val viewModel = cached
return if (viewModel == null) {
val factory = if(needRequestActivity) fragment.requireActivity().defaultViewModelProviderFactory else fragment.defaultViewModelProviderFactory
val store = if(needRequestActivity) fragment.requireActivity().viewModelStore else fragment.viewModelStore
ViewModelProvider(
store,
factory,
if(needRequestActivity) fragment.requireActivity().defaultViewModelCreationExtras else fragment.defaultViewModelCreationExtras
).get(viewModelClass.java).also {
cached = it
}
} else {
viewModel
}
}
override fun isInitialized(): Boolean = cached != null
}
class DefaultViewModelLazy<VM : ViewModel> (
private val viewModelClass: KClass<VM>,
private val storeProducer: ViewModelStore,
private val factoryProducer: Factory,
private val extrasProducer: CreationExtras
) : Lazy<VM> {
private var cached: VM? = null
override val value: VM
get() {
val viewModel = cached
return if (viewModel == null) {
val factory = factoryProducer
val store = storeProducer
ViewModelProvider(
store,
factory,
extrasProducer
).get(viewModelClass.java).also {
cached = it
}
} else {
viewModel
}
}
override fun isInitialized(): Boolean = cached != null
}
inline fun <reified VM : ViewModel> Fragment.defaultViewModels(): Lazy<VM> {
return DefaultFragmentViewModelLazyclass,this
}
inline fun <reified VM : ViewModel> ComponentActivity.defaultViewModels(): Lazy<VM> {
return DefaultViewModelLazyclass, viewModelStore , defaultViewModelProviderFactory, defaultViewModelCreationExtras
}