[英]How to inject viewmodel in a customView with koin?
我知道如何使用 koin 在活动或片段中注入视图模型:
private val regionSelectorViewModel: RegionSelectorViewModel by viewModel()
现在我正在将 viewmodel 设置为我的 customView,如下所示:
fun setViewModel(viewModel: RegionSelectorViewModel) {
mViewModel = viewModel
}
viewmodel在Activity中初始化,通过参数传递给view。 但是......我想像在活动或片段中一样在 customViews 中注入视图模型。 有没有办法使用koin来做到这一点?
最后我得到了解决这个问题的方法,我们只需要从活动上下文中获取视图模型:
private val viewModel: VersionViewModel by lazy {
(context as FragmentActivity).getViewModel()
}
另一种解决方案,或者对我来说最好的解决方案是创建一个委托以从视图中获取视图模型。
inline fun <reified T : ViewModel> ViewGroup.viewModel(): ReadOnlyProperty<ViewGroup, T> =
object : ReadOnlyProperty<ViewGroup, T> {
private var viewModel: T? = null
override operator fun getValue(
thisRef: ViewGroup,
property: KProperty<*>
): T = viewModel ?: createViewModel(thisRef).also { viewModel = it }
private fun createViewModel(thisRef: ViewGroup): T {
return (thisRef.context as FragmentActivity).getViewModel()
}
}
class CustomView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0,
defStyleRes: Int = 0
) : FrameLayout(context, attrs, defStyleAttr, defStyleRes) {
private val viewModel: CustomViewModel by viewModel()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.