我有一个类,其中包含一组应在某个事件(Android上的Gps更新,但在这里不重要)被调用的函数(“侦听器”)。 看起来像这样(为清晰起见大大简化了):
class myClass {
private var listeners = mutableSetOf<(Location) -> Unit>()
fun addListener(listener: (Location) -> Unit) {
listeners.add { listener }
}
private fun updateListeners(location: Location) {
if (!listeners.isEmpty()) {
listeners.forEach {
it.invoke(location)
}
}
}
现在,我正尝试从另一个要在调用updateListeners()时调用的类中添加一个函数。
class myOtherClass {
private fun registerLocationListener() {
myClass.addListener (this::onLocationUpdateReceived)
}
private fun onLocationUpdateReceived(location: Location) {
// do something with the location data
}
编译器在这里没有警告我,因此我首先假设这是正确的。但是不会调用onLocationUpdateReceived。如果使用.toString()记录集合中的项目,则会得到
Function1<android.location.Location, kotlin.Unit>
这似乎是我想要的-但是我对此事的经验有限,所以我可能是错的。 因此,我知道调用了updateListeners(),我知道将“内容”放入我的集合中,但是onLocationUpdateReceived却从未被调用。
有人可以帮助我完成设置工作吗?
答案 0 :(得分:6)
代码中有错误
fun addListener(listener: (Location) -> Unit) {
listeners.add { listener }
}
您在这里add
向listeners
集合添加了一个新的lambda。 lambda不会执行任何操作,因为您不会调用listener
。
正确的代码是
fun addListener(listener: (Location) -> Unit) {
listeners.add(listener)
}
或者您可以说add { listener() }
,但我认为没有理由