如何使用koin在customView中注入viewmodel?

时间:2020-04-07 10:38:43

标签: android mvvm android-custom-view koin

我知道如何使用koin在“活动”或“片段”中插入viewmodel:

private val regionSelectorViewModel: RegionSelectorViewModel by viewModel()

现在,我正在将viewmodel设置为我的customView:

fun setViewModel(viewModel: RegionSelectorViewModel) {
    mViewModel = viewModel
}

viewmodel在Activity中初始化,并通过参数传递给view。但是...我想像在活动或片段中一样,将viewmodel注入customViews中。有没有办法使用koin做到这一点?

1 个答案:

答案 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()
  
}