相关疑难解决方法(0)

使用简短表示法时如何在匿名侦听器中引用"this"?

在Kotlin中,有没有办法在匿名类中使用这个简短表示法时引用侦听器实例?在这种情况下,this引用外部上下文(例如Activity实例)view定义:

view.setOnClickListener {
    val self: View.OnClickListener = this // Not compiling, "this" references outer context
}
Run Code Online (Sandbox Code Playgroud)

当使用较长的表示法时,您明确声明要实现的接口以及显式覆盖回调方法的位置,可以通过this以下方式引用侦听器:

view.setOnClickListener(object: View.OnClickListener {
    override fun onClick(v: View) {
        val self: View.OnClickListener = this // Ok
    }
})
Run Code Online (Sandbox Code Playgroud)

kotlin

11
推荐指数
2
解决办法
2135
查看次数

Kotlin 推荐的使用 SAM 取消注册侦听器的方法

所以我有一个交互器,它使用 Realm 执行插入操作,然后通过 RealChangeListener 通知插入已完成。它是这样的:

fun insertCar(item: Car) {
        realm.doInTransaction {
            val car = Car(...)
            val copy = copyToRealm(car)
            copy.addChangeListener(...)
        }
    }
Run Code Online (Sandbox Code Playgroud)

我可以这样做:

fun insertCar(item: Car, listener: RealmChangeListener<Car>) {
            realm.doInTransaction {
                val car = Car(...)
                val copy = copyToRealm(car)
                copy.addChangeListener(listener)
            }
        }
Run Code Online (Sandbox Code Playgroud)

并像这样访问:

realmInteractor.insertCar(item, RealmChangeListener {
   // do something here
})
Run Code Online (Sandbox Code Playgroud)

但后来我无法删除这个听众

realmInteractor.insertCar(item, RealmChangeListener {
   // do something here
   it.removeChangeListener(this)
})
Run Code Online (Sandbox Code Playgroud)

this 将指向它所在的类而不是实际的侦听器

我也可以这样做:

fun insertCar(item: Car, doAfterChange (Car) -> Unit) {
                realm.doInTransaction {
                    val car = Car(...)
                    val copy …
Run Code Online (Sandbox Code Playgroud)

sam listener kotlin

3
推荐指数
1
解决办法
1651
查看次数

标签 统计

kotlin ×2

listener ×1

sam ×1