我知道如何使用koin在“活动”或“片段”中插入viewmodel:
private val regionSelectorViewModel: RegionSelectorViewModel by viewModel()
现在,我正在将viewmodel设置为我的customView:
fun setViewModel(viewModel: RegionSelectorViewModel) {
mViewModel = viewModel
}
viewmodel在Activity中初始化,并通过参数传递给view。但是...我想像在活动或片段中一样,将viewmodel注入customViews中。有没有办法使用koin做到这一点?
答案 0 :(得分:1)
最后我找到了解决这个问题的方法,我们只需要从活动上下文中获取viewmodel:
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()
}