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 的副本就可以了。
当应用程序的 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 的副本就可以了。