Jetpack Compose 使 LiveData 观察器 returns 成为错误的数据类型:foo.Bar 无法转换为 kotlin.Result

Jetpack Compose makes LiveData observer returns a wrong data type: foo.Bar cannot be cast to kotlin.Result

当应用程序的 gradle build.gradle.kts 文件中未启用 Jetpack Compose 标志时,我的 LiveData 观察器 returns 正确的数据类型 kotlin.Result<List<Person>> 用于 personsResult 根据我在片段中的代码:

private fun observePersons() {
        val observer: (kotlin.Result<List<Person>>) -> Unit = { personsResult ->
            // Do something
        }
        viewModel.personsResult.observe(viewLifecycleOwner, observer)
    }

然而,当我启用它时:

buildFeatures{
        compose = true
    }

LiveData 观察器 returns ArrayList<Person> 类型的 personsResult 而不是 kotlin.Result<List<Person>>,导致应用程序崩溃并出现错误

java.lang.ClassCastException: java.util.ArrayList cannot be cast to kotlin.Result

当我查看堆栈跟踪时,在调用 onChanged() 之前,LiveData 中的 mData 似乎仍然是正确的类型:

invoke:61, DevPersonListFragment$observePersons$observer  // personsResult as? kotlin.Result<List<Person>> == null
invoke:60, DevPersonListFragment$observePersons$observer 
onChanged:-1, DevPersonListFragment$sam$androidx_lifecycle_Observer[=16=] 
considerNotify:133, LiveData (androidx.lifecycle)           // mData as? kotlin.Result<List<Person>> != null
dispatchingValue:151, LiveData (androidx.lifecycle)
setValue:309, LiveData (androidx.lifecycle)
setValue:50, MutableLiveData (androidx.lifecycle)
invokeSuspend:99, LiveDataScopeImpl$emit (androidx.lifecycle)
resumeWith:33, BaseContinuationImpl (kotlin.coroutines.jvm.internal)
run:106, DispatchedTask (kotlinx.coroutines)
handleCallback:938, Handler (android.os)
dispatchMessage:99, Handler (android.os)
loop:223, Looper (android.os)
main:7656, ActivityThread (android.app)
run:592, RuntimeInit$MethodAndArgsCaller (com.android.internal.os)
main:947, ZygoteInit (com.android.internal.os)

我的生命周期依赖项如下

implementation(Libs.Lifecycle.viewmodelCompose)
implementation(Libs.Lifecycle.Ktx.viewmodel)
implementation(Libs.Lifecycle.Ktx.runtime)
implementation(Libs.Lifecycle.Ktx.livedata)

.

object Lifecycle {
            const val viewmodelCompose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha04"
            object Ktx {
                private const val version = "2.3.1"
                const val livedata = "androidx.lifecycle:lifecycle-livedata-ktx:$version"
                const val runtime = "androidx.lifecycle:lifecycle-runtime-ktx:$version"
                const val viewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:$version"
            }
        }

编辑:这是我的 ViewModel

class PersonListViewModel : ViewModel() {

    private val _personsResult: LiveData<kotlin.Result<List<Person>>> =
        Repository
            .getPersons()
            .asLiveData(Dispatchers.IO) as MutableLiveData

    val personsResult: LiveData<kotlin.Result<List<Person>>> = _personsResult
}

Repository.getPersons() 具有以下签名

fun getPersons(): Flow<kotlin.Result<List<Person>>>

问题实际上出在kotlin.Result,当kotlin.Result的内容被复制到一个新的class并使用时,它工作正常。

它类似于此 Jetbrains issue 中描述的错误。通常情况下,使用标志 -Xallow-result-return-type 可以将 kotlin.Result 用作 return 类型,但对于 Jetpack Compose,情况似乎不再如此。

在等待他们解决这个问题时,使用 kotlin.Result 的副本就可以了。