在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) 所以我有一个交互器,它使用 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)