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

Áng*_*cía 6 android mvvm android-custom-view koin

我知道如何使用 koin 在活动或片段中注入视图模型:

private val regionSelectorViewModel: RegionSelectorViewModel by viewModel()
Run Code Online (Sandbox Code Playgroud)

现在我正在将 viewmodel 设置为我的 customView ,如下所示:

fun setViewModel(viewModel: RegionSelectorViewModel) {
    mViewModel = viewModel
}
Run Code Online (Sandbox Code Playgroud)

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

Áng*_*cía 7

最后我得到了这个问题的解决方案,我们只需要从活动上下文中获取视图模型:

  private val viewModel: VersionViewModel by lazy {
    (context as FragmentActivity).getViewModel()
  }
Run Code Online (Sandbox Code Playgroud)

另一个解决方案,或者对我来说最好的解决方案是创建一个委托来从视图中获取视图模型。

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()
  
}
Run Code Online (Sandbox Code Playgroud)