아래는 코모스튜디오가 직접 만든 무료 앱이에요(한 번만 봐주세요 ^^)
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 -> {
집중!!
' [안드로이드 공부] > Compose' 카테고리의 다른 글
Scaffold Content()에 LazyColum 문제 (0) | 2024.06.28 |
---|---|
Unresolved reference: copy (0) | 2024.05.27 |
Scafford에서 bottomBar, topBar 안보이게 하기 (0) | 2024.04.26 |
Scaffold에 Shape 적용하기 (0) | 2024.04.22 |
Caused by: java.lang.IllegalArgumentException: MaterialThemeUsingMdcTheme requires the host context's theme to extend Theme.MaterialComponents (0) | 2023.07.21 |
모든 게시물은 코모스튜디오의 소유이며, 무단 복제 수정은 절대 불가입니다. |
퍼가실 경우 댓글과 블로그 주소를 남기고 해당 게시물에 출처를 명확히 밝히세요. |