Котлин: Функции высшего порядка, как добавить функции в набор и вызвать их - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть класс, который содержит набор функций («слушателей»), которые должны вызываться при определенном событии (обновление Gps на Android, но это не должно быть важным здесь).Это выглядит так (значительно упрощено для ясности):

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 никогда не вызывается.

Кто-нибудь может мне помочь с тем, как я должен настроить это, чтобы оно работало?

1 Ответ

0 голосов
/ 20 февраля 2019

В коде есть ошибка

fun addListener(listener: (Location) -> Unit) {
    listeners.add { listener }
}

Вот вам add новая лямбда в коллекцию listeners.Лямбда ничего не делает, так как вы не вызываете listener.Правильный код:

fun addListener(listener: (Location) -> Unit) {
    listeners.add(listener)
}

Или вы можете сказать add { listener() }, но я не вижу причин для этого

...