LiveData / Flow / StateFlow
다들 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
* https://kotlinworld.com/233?category=973477
* https://readystory.tistory.com/207