Kotlin中作为PagingAdapter监听器的内联函数如何引用自身完成移除
问题根因
你之前的写法存在两个核心问题:
- lambda 表达式中的
this默认指向外层类实例(如 Activity、Fragment 等),而非当前 lambda 自身实例,因此传入this无法匹配到你添加的监听器,移除逻辑自然不生效。 - 第二种写法把匿名函数嵌套在了 lambda 块内部,相当于你传给
addLoadStateListener的是外层无用的 lambda,内部定义的匿名函数根本没有被注册为监听器,当然不会触发。
正确实现方案
Kotlin 中函数类型的实例无法直接自引用,我们可以通过先声明监听器变量、再通过闭包访问变量引用的方式实现自我移除,有两种常用写法:
写法1:使用 lateinit 声明(适合确定会初始化的场景)
// 先声明监听器变量 lateinit var loadStateListener: (CombinedLoadStates) -> Unit // 赋值监听器逻辑,内部引用自身变量完成移除 loadStateListener = { combinedLoadStates -> // 此处编写你的业务逻辑 // 触发后移除自身 myPagingAdapter.removeLoadStateListener(loadStateListener) } // 注册监听器 myPagingAdapter.addLoadStateListener(loadStateListener)
写法2:使用可空类型声明(适合空安全要求更高的场景)
// 声明可空的监听器变量 private var loadStateListener: ((CombinedLoadStates) -> Unit)? = null // 注册逻辑 loadStateListener = { combinedLoadStates -> // 此处编写你的业务逻辑 // 触发后移除自身 loadStateListener?.let { myPagingAdapter.removeLoadStateListener(it) loadStateListener = null // 置空避免内存泄漏 } } loadStateListener?.let { myPagingAdapter.addLoadStateListener(it) } // 可选:如果监听器还没触发就销毁页面,主动移除避免泄漏 override fun onDestroy() { super.onDestroy() loadStateListener?.let { myPagingAdapter.removeLoadStateListener(it) } loadStateListener = null }
内容的提问来源于stack exchange,提问作者Shadow
相关产品推荐
相关产品推荐

