[안드로이드 공부]/Compose

Incompatible types: UiState.Loading and State<UiState<UiData<Any>>>

코코모모 2024. 5. 26. 11:26

아래는 코모스튜디오가 직접 만든 무료 앱이에요
(한 번만 봐주세요 ^^)

01

02

03

정각알림 만들기(말하는시계)

말하는 시계 (취침, 자전거) 

말하는 타이머 음성 스톱워치 

 Incompatible types: UiState.Loading and State<UiState<UiData<Any>>> 

 

문제 발생 코드

val uiState: State<UiState<UiData<Any>>> = viewModel.uiState.collectAsStateWithLifecycle()
when (uiState) {
    is UiState.Loading -> {

 

원인과 해결

 Incompatible types: UiState.Loading and State<UiState<UiData<Any>>> 오류는 uiState 변수의 타입이 State<UiState<UiData<Any>>>가 아니라 UiState.Loading이기 때문에 발생합니다.

 

1. uiState 변수의 타입을 State<UiState<UiData<Any>>>으로 변경합니다.

val uiState: State<UiState<UiData<Any>>> = viewModel.uiState.collectAsStateWithLifecycle()

 

2. when 블록 내부에서 uiState 변수를 UiState 객체로 캐스팅합니다.

when (val state = uiState.value) {
    is UiState.Loading -> {
        // 로딩 상태일 때 표시할 UI
    }
    is UiState.Success -> {
        // 성공 상태일 때 표시할 UI
    }
    is UiState.Error -> {
        // 에러 상태일 때 표시할 UI
    }
}

 

when(uiState) --> when(uiState.value)

 

이렇게 하면 uiState 변수의 타입이 State<UiState<UiData<Any>>>이고 when 블록 내부에서 UiState 객체로 캐스팅되므로 오류가 해결됩니다.

collectAsStateWithLifecycle() 함수는 State<T> 타입의 변수를 반환합니다.
uiState 변수는 State<UiState<UiData<Any>>> 타입이어야 합니다.
when 블록 내부에서 uiState 변수를 UiState 객체로 캐스팅하여 UiState 객체의 프로퍼티와 메서드에 접근할 수 있습니다.

 

UiState는 열거형이며 Loading, Success, Error와 같은 상태를 나타냅니다.
UiData는 데이터를 나타내는 클래스입니다.
Any는 모든 타입의 데이터를 나타내는 타입입니다.
Incompatible types: UiState.Loading and State<UiState<UiData<Any>>> 오류는 uiState 변수의 타입이 잘못되었기 때문에 발생합니다. 이 오류를 해결하려면 uiState 변수의 타입을 State<UiState<UiData<Any>>>으로 변경하고 when 블록 내부에서 UiState 객체로 캐스팅해야 합니다.

 

다른 해결 방법은

val uiState by viewModel.uiState.collectAsStateWithLifecycle()
when (uiState) {
    is UiState.Loading -> {

 

집중!!

모든 게시물은 코모스튜디오의 소유이며, 무단 복제 수정은 절대 불가입니다.
퍼가실 경우 댓글과 블로그 주소를 남기고 해당 게시물에 출처를 명확히 밝히세요.