类似于iamjonfry在这里的方法...
简单示例:与 UI 内容一起(即。title
(,我的数据类 (MyUIState
( 具有onClicked
属性。当MyFragment
时,例如,一RecyclerView
按钮将myViewsData
提交到ListAdapter
,适配器设置每个项目的OnClickListener
以调用数据类中相应的onClicked
函数(最初来自ViewModel
// MyViewModel.kt - Note: It does not reference anything in Activity/Fragment/View layer
// Data Class representing State that will map to the View Layer
data class MyState(val myItems: List<Item>) {
/* Other properties go here. Not necessary for sake of example */
// Item will map to a button in the View Layer
data class Item(
val title: String,
val onClicked: (() -> Unit)? // I want to know if this is okay to do
)
}
//LiveData for Activity/Fragment/View to observe
val myStateLiveData: MutableLiveData<MyState> = MutableLiveData()
fun refreshState() {
myStateLiveData.value = MyState(
getRawData().map {
MyState.Item(
title = it.title,
// Note the lambda being passed here...
onClicked = { /* do stuff in here */ }
)
}
)
}
主要问题:ViewModel 的 LiveData 包含要调用的相应视图的函数类型(例如,将onClick
处理程序传递给视图(是否是一种合理的方法?如果不是,正确的标准是什么?
是的,这会泄漏您的 UI 组件。LiveData 的观察者在超出范围时会自动断开连接,因此它们不会泄露。但是,如果 LiveData 本身存储了对捕获活动或片段中任何内容的 lambda 的间接引用,则该活动或片段将被泄露。没有自动删除代码中的引用的机制。理论上你可以使用 WeakReferences,但这会导致复杂的代码,并且通过将 UI 引用传递给 ViewModel,无论如何你都会违反 MVVM。