UDF 적용 MVVM 패턴을 사용합니다.
화면 단위로 presentation 내 sub-package를 둡니다.
feature
ㄴ component
ㄴ navigation
ㄴ ${Feature}Contract.kt
ㄴ ${Feature}Screen.kt
ㄴ ${Feature}ViewModel.kt
Contract는 UiState와 UiEffect를 갖습니다.
data class ${Feature}UiState(
...
) : UiState
sealed interface ${Feature}UiEffect : UiEffect {
...
}
뷰모델에서 비동기로 로드하는 데이터의 경우 반드시 Async로 래핑 (초기값 Init)
sealed interface Async<out T> {
data object Empty : Async<Nothing>
data class Loading<out T>(
val data: T? = null,
) : Async<T>
data class Success<out T>(
val data: T,
) : Async<T>
data class Failure(
val message: String,
) : Async<Nothing>
data object Init : Async<Nothing>
}
refresh 등 로딩 중에도 기존 불러온 데이터를 보여줄 때는, 기존 데이터를 Loading의 data에 넣기
Empty는 UI에 emptyUI를 보여주는 경우 사용
Failure는 UI에 에러를 인라인 메시지로 보여주는 경우 사용
Show{이름(optional)_타입}
NavigateTo{화면}PopBackStackShow{타입}
ViewModel은 BaseViewModel을 상속받습니다.
UiState와 UiEffect에 대한 Flow 생성 및 구독을 위한 반복 코드를 최소화합니다.