当在kotlin中使用Interface来实现LifecycleObserver,并添加相关的lifecycle事件在接口上,如:
interface PageObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onPageStart() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onPageStop() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onPageDestroy() {
}
}
在编译时会遇到如下的错误:
error: 1st argument of a callback method must be a LifecycleOwner which represents the source of the event
public static void onPageStart(xxx.PageObserver $this)
意思是kotlin在编译阶段生成代码时,会将this插入第一个参数,当时必须的是LifecycleOwner
下面介绍两种解决方式
-
第一种是用
annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.2.0' 使用annotationProcessor代替kapt,这个是因为两者处理还是有一些内在区别,annotationProcessor通常用在java代码里面,kapt通常是针对kotlin代码 // kapt 'androidx.lifecycle:lifecycle-compiler:2.2.0'
-
第二种是用class代替interface
class PageObserverClass(val pageObserver: PageObserver) : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_START) fun onPageStart() { pageObserver.onPageStart() } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) fun onPageStop() { pageObserver.onPageStop() } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun onPageDestroy() { pageObserver.onPageDestroy() } }
网友评论