build.gradle 속성 추가
기본적으로 mavericks는 반드시 추가 후 프로젝트에 따라 library 추가한다.
// build.gradle(:app)
implementation("com.airbnb.android:mavericks:x.y.z")
implementation("com.airbnb.android:mavericks-compose:x.y.z") // Compose 사용시
implementation("com.airbnb.android:mavericks-hilt:x.y.z") // Hilt DI 사용시
implementation("com.airbnb.android:mavericks-navigation:x.y.z") // Navigate 사용시
MainActivity의 onCreate에 Mavericks.initialize(this) 추가
// MainActivity
override fun onCreate(savedInstanceState: Bundle?) {
Mavericks.initialize(this)
// Compose Navigation 사용시 아래 initialize 사용
// Mavericks.initialize(this, viewModelDelegateFactory = DefaultNavigationViewModelDelegateFactory())
}
// UI State
// UserState.class
data class UserState(
val score: Int = 0,
val previousHighScore: Int = 150,
val livesLeft: Int = 99,
) : MavericksState {
// Properties inside the body of your state class are "derived".
val pointsUntilHighScore = (previousHighScore - score).coerceAtLeast(0)
val isHighScore = score >= previousHighScore
}
MavericksState interface를 상속함으로써 생성 가능하다.
MavericksState는 아무 역할도 가지지 않았지만(override fun이 없음) 상속받음으로써 State임을 알릴 수 있다.
또한 State의 기본 상태뿐만 아니라 데이터로부터 파생속성을 만들 수 있다.(기본 상태 변경에 따라 파생속성 또한 동기화된다)
// ViewModel
// UserViewModel.class
class UserViewModel(
initialState: MyState,
...
) : MavericksViewModel<MyState>(initialState) {
...
companion object : MavericksViewModelFactory<MyViewModel, MyState> {
override fun initialState(viewModelContext: ViewModelContext): MyState {
return MyState(...)
}
override fun create(viewModelContext: ViewModelContext, state: MyState): MyViewModel {
return MyViewModel(state, ...)
}
}
}
MavericksViewModel Class를 상속받아 구현 가능하다.
Mavericks ViewModel은 Jetpack의 ViewModel과 개념적으로 거의 동일하며 ViewModel은 상태를 업데이트 하거나 다른 Class에서 구독 가능하도록 State를 노출한다.
State Update는 viewModel 내에서 setState { copy(state = newValue) } 을 호출하면 된다.
State Update의 변경에 따라 특정 동작을 수행해야 할 때는
onEach { state -> func() } 같은 방식으로 func() 수행이 가능하며
특정 Property에 대한 subscribe을 원한다면
onEach(CustomState::property) { prop -> }으로 가능하며 property는 복수개의 property를 한번에 구독하는 것 또한 가능하다.
Mavericks State Class를 렌더링한다.
MavericksViewModel에 접근하고 invalidate()를 사용해서 state를 구독할 수 있고 invalidate()는 각 state가 변경 될때마다 호출되며 invalite()는 UI를 다시 그릴때 사용된다.
Compose를 사용해 UI를 구성하고 렌더링 할 때는 MavericksView가 사용되지 않으며
implementation("com.airbnb.android:mavericks-compose:x.y.z")
를 gradle에 추가하여 Compose에서 MavericksState의 값을 구독할 수 있다.