【问题标题】:Inject viewModel with hilt用刀柄注入 viewModel
【发布时间】:2020-09-13 13:32:05
【问题描述】:

我想用 Hilt 将我的 viewModel 注入到 RecyclerView 中。 它可以被注入,但当 recyclerView 被销毁时 viewModel 不会被销毁。 用 hilt 在 recyclerView 中注入 viewModel 的最佳方法是什么?

【问题讨论】:

  • 您是否尝试将 ViewModel 注入到回收器视图适配器中?如果是,用例场景是什么?
  • 是的,我想在 RecyclerView Adapter 中添加 viewModel。就我而言,我希望每个 recyclerView 适配器都有自己的 viewModel,这样我们就可以观察片段中的 viewModel 对象
  • 理想情况下,情况并非如此。请解释您的用例。
  • 例如,我们想检测片段内的行点击,但我们的 recyclerViewAdapter 在应用程序中重用多个位置
  • 不应将 Viewmodel 注入适配器。无论您要实现什么目标,都有更好的方法来实现这一目标。

标签: android android-recyclerview dagger-2 dagger-hilt recyclerlistview


【解决方案1】:

最好的方法是创建单独的适配器和视图持有者类,然后您可以将视图模型注入到该视图持有者类而不是适配器中。 要销毁视图模型,您应该通过观​​察父生命周期来手动完成。当父生命周期事件为 ON_DESTROY 时,在适配器类的 init 块中执行类似的操作。

parentLifecycle.addObserver(object : LifecycleObserver {

            @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
            fun onParentDestroy() {
                recyclerView?.run {
                    for (i in 0 until childCount) {
                        getChildAt(i)?.let {
                            (getChildViewHolder(it) as BaseItemViewHolder<*, *>)
                                .run {
                                    onDestroy()
                                    viewModel.onManualCleared()
                                }
                        }
                    }
                }
            }
  }

这里onManualCleared()函数调用onCleared()

【讨论】:

    【解决方案2】:

    不应将视图模型注入到适配器中,正如我在 cmets 中所读到的,您可以使用比这更好的方法,
    假设您有一个包含许多行的适配器,当用户单击时,每一行它,它执行网络调用。
    首先,创建一个interface

    interface Click {
    fun onClick(index: Int, item: Model)
    }
    

    在您的适配器中,初始化它的一个实例,然后在您的 onBindViewHolder 中使用它

    yourview.setOnClickListener {v-> interface.onClick()}
    

    无论您使用它的地方(Activity/Fragment/...),不要忘记初始化界面。
    这是一个比对每一行都使用 ViewModel 更好的解决方案,这可能会导致 SystemLeaks。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-22
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多