ABOUT ME

-

  • Android) asStateFlow() 메소드 알아보기
    Android 2021. 2. 17. 13:10


    저는 요즘 StateFlow를 사용해서 UI 상태 관리 코드를 작성하고 있습니다.

     

    ViewModel

     private val _uiState = MutableStateFlow<State<List<SkinInfo>>>(State.empty())
        val uiState: StateFlow<State<List<SkinInfo>>> get() = _uiState

    어디서 많이 보던 코드 같죠? LiveData를 사용할때 처럼 backing property(외부에서 변경 못하게하고 내부에서 변경이 가능)를 선언하는 방법과 굉장히 유사합니다. 단지 StateFlow는 초기값이 필요하다는 점이 다른 것 같군요.

     

    어쨌든 이런식으로 코드를 작성하고 있었는데, asStateFlow()라는 메소드를 알게 되었습니다.

    asStateFlow()의 내부는 아래와 같습니다.

    /**
     * Represents this mutable state flow as a read-only state flow.
     */
    public fun <T> MutableStateFlow<T>.asStateFlow(): StateFlow<T> =
        ReadonlyStateFlow(this)

    내부를 둘러보면 asStateFlow() 메소드는 read-only function이라고 되어있군요. 그러면 위의 코드를 asStateFlow()를 사용해서 바꿀 수 있지 않을까요?

     

    구글링을 열심히 해봤는데, asStateFlow()에 관한 한글로 된 개발 블로그는 아직까지 없더군요ㅠ.. 

     

    그래서 외국 블로그에서 해당 이슈에 관한 질문을 남긴 개발자를 발견했습니다.

     

    ViewModel

     private val _uiState : MutableStateFlow<State> = MutableStateFlow(initialState)
        val uiState = _uiState.asStateFlow()

    질문 내용을 보면 asStateFlow() 메소드를 사용하는 게 비효율적이지 않냐?라는 질문입니다. (궁금 궁금)

     

    작성자의 답변은 위와 같습니다. 공식문서에서 asStateFlow()를 사용하는 것을 추천하고 있다고 하네요. 

    그럼 공식문서를 보겠습니다.

     

    캡슐화를 위해 asStateFlow() 메서드를 사용해서 코드를 작성하고 있군요.

     

    아직 확실하지 않은 느낌이 들어 또 하나의 이슈를 보겠습니다.

     

    Inspect to suggest MutableSharedFlow.asSharedFlow() instead of SharedFlow upcast

    class Model {
        private val _state = MutableStateFlow<Int>()
        val state: StateFlow<Int> = _state // upcast to read-only interface (1)
        private val _state = MutableStateFlow<Int>()
        val state: StateFlow<Int> = _state.asStateFlow() // upcast to read-only interface (2)   
    }

    해당 이슈에는 이렇게 적혀있군요!

     

    약간의 안전성이 추가된 asStateFlow()asSharedFlow() 확장 함수를 제공하므로 모든 경우에 이러한 확장함수를 사용하면 유용합니다.

     

     

    제가 궁금했던 점은 기존의 방식 asStateFlow()를 사용하는 방식이 어떤 차이가 있을까에 대한 것이었는데,

    두 가지 방법 모두 사용 가능하고 단지 확장 함수의 개념이라고 생각하시면 될듯합니다.


    Reference

    https://youtrack.jetbrains.com/issue/KT-39443

    반응형

    댓글

Designed by Me.