CodeLab ViewModel 에 데이터 저장하기

day_0893·2023년 9월 3일

CodeLab

목록 보기
1/2

CodeLab Url

4. ViewModel 추가하기

  • Kotlin 속성 위임: var < proverty-name>: < property-type> by < delegate-class>()
    kotlin에는 var 속성에 자동으로 getter와 setter 함수가 생성됩니다.
    val의 경우에는 getter만 생성됩니다.

  • 아래와 같이 by를 사용하여 위임할경우 getter와 setter의 책임을 다른 클래스에 넘길 수 있습니다.(대리자 클래스)

private val viewModel: GameViewModel by viewModels()
  • 아래와 같이 뷰 모델을 초기화할 기기의 구성이 변경되는 동안 앱이 viewModel 참조의 상태를 손실하게 되빈다.
    예를 들어 기기를 회전하면 활동이 소멸된 후 다시 생성되고 초기상태의 새로운 뷰 모델 인스턴스가 다시 시작됩니다.
    대신 속성 위임 적용 방식을 사용해 viewModel을 초기화하면 대리자 클래스는 첫 액세스시 자동으로 viewModel 객체를 만들고 이 값을 구성 변경 중에도 유지했다가 요청이 있을 때 반환합니다.
private var viewModel: GameViewModel()

5. ViewModel로 데이터 이동

UI에 표시되어야 하는 내용은 ViewModel로 옮긴다
private var로 설정하여 외부에서 접근을 막는다.

class GameViewModel : ViewModel() {

    private var score = 0
    private var currentWordCount = 0
    private var currentScrambledWord = "test"
...
}
  • 지원속성 Backing properties
    외부에서 읽은 수는 있지만 수정은 불가능하도록 만들어야할 때 사용하는 방식
//ex1
// Declare private mutable variable that can only be modified
// within the class it is declared.
private var _count = 0

// Declare another public immutable field and override its getter method.
// Return the private property's value in the getter method.
// When count is accessed, the get() function is called and
// the value of _count is returned.
val count: Int
   get() = _count

//ex2
private var _table: Map<String, Int>? = null
public val table: Map<String, Int>
    get() {
        if (_table == null) {
            _table = HashMap() // Type parameters are inferred
        }
        return _table ?: throw AssertionError("Set to null by another thread")
    }

6.ViewModel의 수명주기

viewModel의 수명주기는 Activity와 Fragment의 범위가 유지되는 동안 유지됩니다.

  • ANdroid 앱 아키텍처 가이드라인에서는 책임이 서로 다른 클래스를 분리하고 모델에서 UI를 만들도록 권장합니다.
  • UI 컨트롤러는 Activity 또는 Fragment 와 같은 UI 기반 클래스입니다. UI 컨트롤러에는 UI 및 운영체제 상호작용을 처리하는 로직만 포함해야합니다. UI에 표시할 데이터의 소스여서는 안 됩니다. UI 에 표시할 데이터와 모든 관련 로직은 ViewModel에 배치합니다.
  • ViewModel 클래스는 Ui 관련 데이터를 저장하고 관리합니다. 화면 회전과 같이 구성을 변경해도 데이터를 유지할 수 있습니다.
  • ViewModel은 권장되는 Android 아키텍처 구조입니다.

참고

0개의 댓글