簡體   English   中英

Kotlin 密封 class 當表達式在 compose 中不起作用時

[英]Kotlin sealed class when expression not working in compose

我有以下代碼:

sealed class ChooseCarState {
 data class ShowCarsState(val car: Int) : ChooseCarState()
 object ShowLoadingState : ChooseCarState()
 data class ShowError(val message: String) : ChooseCarState()
}

當在可組合 function 中觀察來自 ViewModel 的密封 class 時:

@Composable
fun showCars(){
val state = viewModel.chooseCarState.collectAsState()
when(state.value){
    is ChooseCarState.ShowCarsState->{
        val car = (state.value as ChooseCarState.ShowCarsState).car
    }
    is ChooseCarState.ShowLoadingState->{

    }
    is ChooseCarState.ShowError ->{
        val message  = (state.value as ChooseCarState.ShowError).message
    }
  }
}

我得到了 ClassCastException,盡管我在is語句中進行轉換。

可能是什么問題?

問題在於,從編譯器的角度來看,無法保證state.value將始終返回相同的值,因為它不是最終字段。 您可以通過將state.value分配給一個變量來解決此問題,然后您可以安全地對其進行轉換。 然后可用於智能演員。

@Composable
fun showCars(){
val state = viewModel.chooseCarState.collectAsState()
when(val currentState = state.value){
    is ChooseCarState.ShowCarsState->{
        val car = currentState.car
    }
    is ChooseCarState.ShowLoadingState->{

    }
    is ChooseCarState.ShowError ->{
        val message  = currentState.message
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM