我的MVP演示者已绑定到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 }
}
问题在于lambda没有在forEach中调用。如果我在lambda中添加funShowProgress(),则可以正常工作。另外,lambda也在那里,因为它在forEach内部恰好运行一次,但是没有调用view.showProgress()。我对lambda有什么误解?
请注意,虽然我可以直接从视图中调用showProgress(),但我想避免这种情况。
答案 0 :(得分:4)
您的ImageBuilder.Current.Build(new ImageJob(image, outputStream2, instructions2));
调用是错误的:它添加了一个lambda来计算add
表达式而没有任何结果(它不调用lambda)。使用以下任一方法:
funShowProgress
或者简单地
add { funShowProgress() }
答案 1 :(得分:1)
要扩展yole的答案,如果您定义如下函数,也可以使用add(::funShowProgressAsFunction )
添加函数引用:
private val funShowProgressAsFunction : Unit =
view()?.showProgress()