在 Kotlin 中迭代 lambda

Her*_*t74 0 foreach lambda kotlin

我的 MVP Presenter 与 onResume 中的视图绑定,这样可以保证解除绑定。这意味着有时,例如当数据来自 onActivityResult() 时,视图未绑定,但我们仍然希望触摸视图,以显示进度等。到目前为止,我为此使用了一个标志并在bindView() 或 updateView() 中,当视图绑定时调用。

现在我正在使用 Kotlin,所以我想如果我在 BasePresenter 中使用 lambda 列表会怎样?这是我到目前为止所拥有的:

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 }
}
Run Code Online (Sandbox Code Playgroud)

问题是 lambda 没有在 forEach 中调用。如果我在 lambda 中添加 funShowProgress() ,它就会起作用。另外,lambda 也在那里,因为它在 forEach 中只运行一次,但不会调用 view.showProgress() 。我对 lambda 做错了什么?

请注意,虽然我可以直接从视图调用 showProgress(),但我想避免这种情况。

yol*_*ole 5

您的add调用是错误的:它添加了一个 lambda,该 lambda 计算funShowProgress表达式但没有任何结果(它不调用 lambda)。使用以下任一方法:

add { funShowProgress() }
Run Code Online (Sandbox Code Playgroud)

或者简单地

add(funShowProgress)
Run Code Online (Sandbox Code Playgroud)