[英]Why can't I get data directly from a sealed class in Kotlin?
我希望从密封的 class Result<out R>
中获取数据,但是val mydata = queryList.data
导致以下错误,我该如何解决?
错误信息智能转换为 'Result.Success<Flow<List>>' 是不可能的,因为 'queryList' 是一个具有开放或自定义 getter 的属性
@Composable
fun Greeting(
name: String
) {
Column( ) {
val queryList by produceState(initialValue = aa() ) {
value = mViewMode.listRecord()
}
when (queryList) {
is Result.Error -> {}
is Result.Loading -> {}
is Result.Success -> {
val mydata = queryList.data //It cause error
}
}
}
}
sealed class Result<out R> {
data class Success<out T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
object Loading : Result<Nothing>()
}
fun aa(): Result<Flow<List<MRecord>>> {
return Result.Loading
}
将返回的属性值缓存在局部变量中,以便可以进行智能转换。 没有局部变量就不能智能转换,因为它是委托属性。
您可以在when
语句中正确执行此操作:
when (val result = queryList) {
is Result.Error -> {}
is Result.Loading -> {}
is Result.Success -> {
val mydata = result.data
// ..
}
}
如错误文本中所述,Kotlin 无法确定对委托属性queryList
的下一次调用与上一次调用具有相同的类型,因此无法对变量进行智能转换。 这可以通过显式转换变量来解决:
when (queryList) {
is Result.Error -> {}
is Result.Loading -> {}
is Result.Success -> {
val mydata = (queryList as Result.Success).data
}
}
如果您的属性委托确实在您每次调用queryList
时都创建了一个新元素,那么建议将您正在检查的值存储在一个新变量中,如下所示:
val q = queryList
when (q) {
is Result.Error -> {}
is Result.Loading -> {}
is Result.Success -> {
val mydata = q.data
}
}
请注意,在这种情况下,Kotlin 能够智能q.data
,因为q
只是一个简单的只读变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.