변화의 감시

개배박발불지은만자·2024년 12월 26일
0

변수의 감시

kotlin compose 상태에서 변수의 감시는 중요하다.

1. 함수를 이용하는 법

가장 간단하며 stream 이 아니기 때문에 suspend 상태에서 호출할 필요가 없다.

2. Cold Stream 를 이용하는법 -> 구독이 있는경우만 값을 방출

Cold Stream : 특정 시점에서만 데이터를 처리하거나, 값의 비교가 필요할 때 호출하는 방식에 적합합니다.

flow

3. Hot Stream : 구독이 없는 경우에도 방출

Hot Stream을 사용하여 값을 감시하는 방법은 StateFlow 또는 SharedFlow를 활용하는 것입니다.
이전에 설명했던 내용과 관련해, Hot Stream은 데이터 소비자가 없어도 값을 방출하며,
이를 통해 실시간 데이터 감시가 가능합니다.

StateFlow , SharedFlow

   // Viewmodel
private val _orgUser = MutableStateFlow(PersonEntity())

private val _user = MutableStateFlow(PersonEntity())
val user: StateFlow<PersonEntity> get() = _user

fun initInfoVM(personEntity: PersonEntity) {
    _user.value = personEntity
    _orgUser.value = personEntity
  }


fun isModified(): Boolean {
    return _user.value != _orgUser.value
  }

val isModifiedFlow = combine(_orgUser, _user) { orgUser, user ->
    orgUser != user // 두 값이 다르면 true, 같으면 false
  }.distinctUntilChanged() // 중복 방지 (값이 변경될 때만 방출)

  // StateFlow로 변경 상태를 감지
val isModified: StateFlow<Boolean> = combine(_orgUser, _user) { orgUser, user ->
    orgUser != user
  }.stateIn(
    scope = CoroutineScope(Dispatchers.Default), // CoroutineScope 필요
    started = SharingStarted.WhileSubscribed(5000L), // 구독 중일 때만 활성화
    initialValue = false // 초기값 설정
  )

compose 내에서 호출법

//1번의 경우 if (vm.isModified()) 함수로 호출
//2번의 경우 
val isModifyed = vm.isModifiedFlow.collectAsState(false) // 로 감시

0개의 댓글