在 kotlin 中用作侦听器时如何使内联函数自行删除
How to make an inline function remove itself when its being used as a listener in kotlin
我遇到了这个问题,我在 SO 中找不到解决方案的任何问题。
我正在使用来自 Google's Paging library 的 PagingAdapter
方法,该方法接收内联函数作为侦听器:
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)
}
})
我遇到了这个问题,我在 SO 中找不到解决方案的任何问题。
我正在使用来自 Google's Paging library 的 PagingAdapter
方法,该方法接收内联函数作为侦听器:
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)
}
})