首页 > 解决方案 > 如何使内联函数在kotlin中用作侦听器时自行删除

问题描述

我已经遇到了这个问题,我在 SO 中找不到任何问题的解决方案。

我正在使用一种PagingAdapter来自Google 的 Paging library的方法,它接收一个内联函数作为侦听器:

    fun addLoadStateListener(listener: (CombinedLoadStates) -> Unit) {
        differ.addLoadStateListener(listener)
    }

然后要删除侦听器,他们提供以下方法

    fun removeLoadStateListener(listener: (CombinedLoadStates) -> Unit) {
        differ.removeLoadStateListener(listener)
    }

我正在这样使用它

myPagingAdapter.addLoadStateListener { it: CombinedLoadStates -> 
    myPagingAdapter.removeLoadStateListener(this)
}

我知道上面的方法不起作用,但是当文件用 java 编写时它起作用了,因为它在自己的函数中对自身有正确的引用。但是,在 Kotlin 中,我根本找不到这样做的方法。我尝试变成一个匿名函数,但它仍然不会传递正确的上下文

myPagingAdapter.addLoadStateListener { fun(it: CombinedLoadStates) -> 
    myPagingAdapter.removeLoadStateListener(this)
}

在这一点上,我不知道如何删除无法引用自身的内联函数,而且我在任何地方都找不到任何解决方案的文档。

如何通过引用自身在 kotlin 中删除内联函数?

标签: androidkotlinandroid-paging-libraryinline-functionsandroid-paging-3

解决方案


如果我理解正确,您需要一个传入的内联函数的引用,addLoadStateListener以便您可以传入removeLoadStateListener. 你可以试试这个

myPagingAdapter.addLoadStateListener(object :  (String) -> Unit {
        override fun invoke(p1: String) {
            myPagingAdapter.removeLoadStateListener(this)
        }

    })

推荐阅读