我正在尝试使用Delegates.observable()
,以便在MutableList
发生变化时收到通知。
val items: MutableList<Item> by Delegates.observable(startingItems) {
_, old, new ->
Log.e("observable", "${old.size} -> ${new.size}")
}
但每当我试图删除或添加一些东西到列表时什么也没发生。我的意思是Logcat中没有日志的痕迹,因为它应该在那里。
docs州:
可观察
Delegates.observable()
有两个参数:初始值和修改处理程序。每次分配给属性时(在执行赋值后)都会调用处理程序。它有三个参数:分配给的属性,旧值和新值。
在您的情况下,您不分配给items
,您只需添加到现有实例。永远不会调用回调。
建议:使用带有只读List
的mutable属性,并在添加新元素时重新分配它:
var items: List<String> by Delegates.observable(mutableListOf()) { _, old, new ->
println("changed")
}
//add like this:
user.items += "new val"
plus
运算符不会在列表中调用add
,而是创建一个包含所有旧元素和新元素的新实例。
我找到了这个问题的答案,实际上'cuz Delegates.observable()
只观察变量的变化,而不是存储在变量中的对象。