在 kotlin 中用作侦听器时如何使内联函数自行删除

How to make an inline function remove itself when its being used as a listener in kotlin

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

我正在使用来自 Google's Paging libraryPagingAdapter 方法,该方法接收内联函数作为侦听器:

    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 中删除内联函数?

您可以创建一个本地函数来引用自身:

fun myFun(CombinedLoadStates): Unit {
    myPagingAdapter.removeLoadStateListener(::myFun)
}

myPagingAdapter.addLoadStateListener(::myFun)

如果我没理解错的话,你需要在 addLoadStateListener 中传递的内联函数的引用,以便你可以在 removeLoadStateListener 中传递。 你可以试试这个

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

    })