Итерация по лямбдам в Котлине - PullRequest
0 голосов
/ 24 октября 2018

Мой MVP-докладчик привязан к представлению в onResume, так что открепление гарантировано.Это означает, что иногда, например, когда данные поступают из onActivityResult (), представление не привязано, но мы все еще хотим коснуться представления, показать прогресс и т. Д. До сих пор я использовал для этого флаг и выполнял эти действия вbindView () или в updateView (), который вызывается, когда представление связано.

Теперь я использую Kotlin, поэтому я подумал, что, если бы я использовал список лямбд для этого в BasePresenter?Это то, что я имею до сих пор:

typealias AnyLambda = () -> Unit
private val deferredActions = mutableListOf<AnyLambda>()

private val funShowProgress : () -> Unit = {
   view()?.showProgress() }

override fun updateView() {
   deferredActions.forEach { anyLambda ->
      anyLambda()
      deferredActions.remove(anyLambda)
   }
}

fun onSomethingFromActivity(x: List<Y>) {
    ...
    deferredActions.add { funShowProgress }
}

Проблема в том, что лямбда не вызывается в forEach.Если я добавлю funShowProgress () внутри лямбды, это будет работать.Также есть лямбда, потому что она запускается внутри forEach ровно один раз, но view.showProgress () не вызывается.Что я не так понял в лямбдах?

Обратите внимание, что хотя я могу вызывать showProgress () прямо из представления, я хочу этого избежать.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

, чтобы расширить ответ yole, вы также можете добавить ссылку на функцию, используя add(::funShowProgressAsFunction ), если определите функцию следующим образом:

private val funShowProgressAsFunction : Unit =
   view()?.showProgress()
0 голосов
/ 24 октября 2018

Ваш add вызов неверен: он добавляет лямбду, которая вычисляет выражение funShowProgress без какого-либо результата (он не вызывает лямбду).Используйте:

add { funShowProgress() }

или просто

add(funShowProgress)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...