Mavericks 구현에 대해 조금 더 알아보자.

interface MavericksView : LifecycleOwner {
    fun invalidate()
}

State사용되는 모든 Kotlin Data Class에서 구현해야하는 인터페이스이다.

오직 Mavericks가 올바르게 동작하도록 설정하기 위해서만 사용된다.

Fragment arguments를 사용해 초기화해야 하는 경우는 보조 생성자를 만든다. 이 ViewModel을 초기화하는 fragment가 Mavericks에서 argument가 있는 경우 Mavericks.KEY_ARG로 보조 생성자로 자동으로 전달된다.

MxRx Fragment 위임자를 통해 작성된 MavericksViewModel에서 상태 변경을 처리하려면 invalidate()를 override한다.

class DogFragment : Fragment(), MavericksView {
   // something
		   ...
		
	override fun invalidate() { / *..* / }
}
abstract class MavericksViewModel<S : MavericksState>(initalState: S) {
    /* .. */
}

모든 뷰모델 클래스는 MavericksViewModel을 확장해야한다. Mavericks에서 ViewModel은 단일 클래스로 한다. ViewModel은 setState를 통해 모든 상태를 수정, 소유하고 다른 클래스는 상태를 관찰할 수 있다.

MavericksView/Fragment에서 ViewModel delegates를 사용하면 lifecycle-aware에 따라 자동으로 구독하고 상태를 업데이트 할 수 있다. 이에따라 변경될 때마다 MavericksView.invalidate가 호출된다.