繁体   English   中英

为什么不能直接从Kotlin中一个密封的class获取数据?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM