지식쌓기

LiveData / Flow / StateFlow

바나나쥬스 2022. 7. 22. 14:54

다들 LiveData에서 Flow 간다고 하는데....

 

Flow는 LiveData 를 대체하지 못하지만 StateFlow라는 놈이 나오면서 대체가 가능해 졌다.

(이대로라면 LiveData는 deprecated 되려나? 차라리 그렇게 되면 선택권이라도 없어지겠구먼... 아직 고민되는군..)

 

적용하면서.. 익힌것들 간략 정리..

// getData()는 Flow<Data> 를 반환

// 1. Flow
val data = useCase.getData()

// 2. LiveData
val dataLiveData: LiveData<Data> = useCase.getData().asLiveData()

// 3. StateFlow
private val _data = MutableStateFlow<Data?>(null)
val data: StateFlow<Result<Data?>> = _data

init {
    viewModelScope.launch {
    	useCase.getData().collect {
            _data.value = it
        }
    }
}

UI에 data를 표시하는데는 세방법 모두 동일하다.

하지만 Flow는 data의 흐름을 발생시키기만 하고 데이터를 저장시켜두지는 않는다..흘러가면 끝.. 

그리고 Flow는 lifecycle과는 전혀 연관이 없기때문에 메모리 누수등을 직접 관리해 줘야 한다. 

위 코드의 Flow를 바로 접근해서 쓰면 데이터 표시에는 문제가 없으나

회전처리등을 할때 매번 data를 새롭게 얻어오고 비효율적이다. (새로 얻어오싶은 경우면 해도 될듯)

 

그래서 2,3번같이 Flow를 데이터 홀더 클래스인 LiveData나 StateFlow에 넣어두고 사용해야 한다.

 

여기서 드는 생각은

Flow는 말 그대로 흐름인데 흐름이 필요없는 경우 그냥 한번만 가져와서 쓰고 마는 경우에는 굳이 Flow를 써야 하나 싶은 생각이 든다.

StateFlow에 직접 값을 넣어도 될거 같은데...

하지만 Paging 라이브러리를 쓰거나 연속적인 데이타를 처리하기엔 아주 좋다

그래서 아래와 같이 표현했나 보다

Flow: Simple things are harder and complex things are easier

 

일단 트렌드니 따라가는걸로..

 

여러 참고 사이트 

* https://medium.com/androiddevelopers/migrating-from-livedata-to-kotlins-flow-379292f419fb

 

Migrating from LiveData to Kotlin’s Flow

In this post you’ll learn how to expose Flows to a view, how to collect them, and how to fine-tune it to fit specific needs.

medium.com

* https://hongbeomi.medium.com/%EB%B2%88%EC%97%AD-livedata%EC%97%90%EC%84%9C-kotlin%EC%9D%98flow%EB%A1%9C-migrating-5b183c363f60

 

[번역]LiveData에서 Kotlin의Flow로 Migrating

LiveData에서 Kotlin의 Flow로 변경하기

hongbeomi.medium.com

* https://kotlinworld.com/233?category=973477 

 

[Coroutine Flow] 3. stateIn 사용하여 Flow를 StateFlow로 변환하기

Flow와 StateFlow 우리는 리액티브 프로그래밍을 할 때 여러 데이터 흐름(flow)를 하나로 합쳐 하나의 데이터 흐름(Flow)으로 만들어낸다. 예를 들어 아래의 그림3에서는 Flow가 3개 있고 이것이 합쳐져

kotlinworld.com

* https://readystory.tistory.com/207

 

[Android] LiveData VS StateFlow, 왜 StateFlow 를 써야할까?

LiveData 는 Lifecycle 라이브러리 중 하나로, 안드로이드 공통의 라이프사이클과 관련된 문제를 해결할 수 있게 해 주면서 앱 개발시 보다 더 유지보수하기 쉽게, 테스트하기 쉽게 만들어주는 라이

readystory.tistory.com