迁移到AndroidX后的SingleLiveEvent问题

13

在使用Android Studio 3.2.1 进行AndroidX迁移后,我因为这个错误无法运行应用:

(未提供错误信息)

SingleLiveEvent.java:29: error: name clash: observe(LifecycleOwner,Observer<T#1>) in SingleLiveEvent and observe(LifecycleOwner,Observer<? super T#2>) in LiveData have the same erasure, yet neither overrides the other
    public void observe(LifecycleOwner owner, final Observer<T> observer) {
                ^
  where T#1,T#2 are type-variables:
    T#1 extends Object declared in class SingleLiveEvent
    T#2 extends Object declared in class LiveData
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

我谷歌了一下,找到了其他问题的解决方案,但如何优雅地解决这个问题呢?我不想在使用单个实时事件的每个地方重构整个应用程序。

2个回答

28

我找到了问题。 LiveData提供了这个:

public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer)

虽然SingleLiveEvent提供了以下内容:

public void observe(LifecycleOwner owner, final Observer<T> observer)

解决方法是更改SingleLiveEvent中的方法签名以匹配LiveData。


SingleLiveEvent 中的 observe 方法覆盖了 LiveData 中的 observe 方法,但是第二个参数的擦除并不匹配。一个是 Observer<? super T>,另一个是 Observer<T>。 - Abdul Wasae
帮我更好地理解这个,卡在同样的问题上了。 - spurthi

2

我在寻找这个Kotlin解决方案:

override fun observe(@NonNull owner: LifecycleOwner, @NonNull observer:Observer<in T>)

翻译:重写observe方法,使用@NonNull注解标记owner和observer参数,其中observer参数是一个泛型类型的观察者。

注意:保留html标签,但不要写解释。


你能加一些解释吗? - m02ph3u5
在迁移到androidX时,我遇到了这个问题。由于我的SingleLiveEvent类是用Kotlin编写的,因此在Kotlin中,_observe_函数应该像这样:override fun observe(@NonNull owner: LifecycleOwner, @NonNull observer:Observer<in T>) - the_lone_wolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接