用刀柄注入 viewModel
Inject viewModel with hilt
我想使用 Hilt 将我的 viewModel 注入到 RecyclerView 中。
它可以注入,但 viewModel 在 recyclerView 销毁时不会销毁。
使用 hilt 在 recyclerView 中注入 viewModel 的最佳方法是什么?
不应将视图模型注入到适配器中,正如我在评论中所读到的那样,您可以找到比这更好的方法,
假设您有一个包含很多行的适配器,每行当用户点击它,它执行网络调用。
首先,创建一个 interface
interface Click {
fun onClick(index: Int, item: Model)
}
在您的适配器中,初始化它的一个实例,然后在您的 onBindViewHolder
中使用它
yourview.setOnClickListener {v-> interface.onClick()}
不要忘记初始化界面,无论您在何处使用它 (Activity/Fragment/...)。
这是比对每一行都使用 ViewModel 更好的解决方案,这可能会导致 SystemLeaks。
最好的方法是创建单独的适配器和 viewholder classes,然后您可以将 viewModel 注入该 viewholder class 而不是适配器。
要销毁 viewModel,您应该通过观察父生命周期手动完成。当父生命周期事件 ON_DESTROY 在适配器 class.
的初始化块中执行类似的操作
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()
.
我想使用 Hilt 将我的 viewModel 注入到 RecyclerView 中。 它可以注入,但 viewModel 在 recyclerView 销毁时不会销毁。 使用 hilt 在 recyclerView 中注入 viewModel 的最佳方法是什么?
不应将视图模型注入到适配器中,正如我在评论中所读到的那样,您可以找到比这更好的方法,
假设您有一个包含很多行的适配器,每行当用户点击它,它执行网络调用。
首先,创建一个 interface
interface Click {
fun onClick(index: Int, item: Model)
}
在您的适配器中,初始化它的一个实例,然后在您的 onBindViewHolder
yourview.setOnClickListener {v-> interface.onClick()}
不要忘记初始化界面,无论您在何处使用它 (Activity/Fragment/...)。
这是比对每一行都使用 ViewModel 更好的解决方案,这可能会导致 SystemLeaks。
最好的方法是创建单独的适配器和 viewholder classes,然后您可以将 viewModel 注入该 viewholder class 而不是适配器。 要销毁 viewModel,您应该通过观察父生命周期手动完成。当父生命周期事件 ON_DESTROY 在适配器 class.
的初始化块中执行类似的操作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()
.