Shared Flow의 사자

2713 단어 AndroidKotlinflowtech
SharedFlow를 사용하는 것이 적당하기 때문에 소개해 드릴게요.

화면 구성 등



화면 설정
'맛있고 건강한'안드로이드 버전의 소개 화면이다.
이 화면을 열면 API에서 정보를 가져와 설정하고 편집할 수 있습니다.
"활동량"을 클릭한 후 ↓의 활동량 선택 화면으로 이동합니다.

맛있는 건강 활동량 선택 화면
이것은 개인 프로필 화면에 표시되는 활동량을 초기값으로 설정합니다
스스로 변경할 수 있습니다.
이렇게 구성된 화면을 만들 때.
  • SharedViewModel을 통한 데이터 공유
  • Room을 통한 데이터 관리
  • SharedPreferences 등을 통한 관리
  • 방법
  • Shared View 모델이라면 각 화면 처리도 넣고 싶고 나중에 힘들어질 거예요.
    ※ 이번 예에서 스팸 화면과 활동량 선택 화면 각각의 처리를 쉐어의 뷰 모델에 적었고, 이후 재평가 시 어느 화면이 처리됐는지 알 수 없음
  • 룸이라면 과장되고 노동시간이 좀 번거로운 일
  • SharedPreferences는 금형에 대한 제한이 생겨서 힘들 때가 있어요.
    등 단점을 꼽았다.
  • SharedFlow를 사용하는 방법에 대해 살펴보겠습니다.

    SharedFlow의 준비.


    class Share {
        private val _testFlow = MutableSharedFlow<String>(1)
        val testFlow: SharedFlow<String> = _testFlow
        suspend fun testSend(args: String) = _testFlow.emit(args)
    }
    
    MutableSharedFlow의 리플레이 수가 1 이상으로 제작됐다.
    개인 프로필 화면에서 emit를 구독한 후 활동량 화면을 구독할 때 데이터를 얻기 위해서다.

    화면 소개 ViewModel


    private val share: Share by inject()
    val input = share.testFlow.asLiveData()
    
    init {
        request.onEach {
            share.testSend(it)
        }.launchIn(viewModelScope)
    }
    
    화면 표시는 SharedFlow 값을 기반으로 합니다.
    이번에 asveData를 만들었지만 Mutable LiveData를 발표하고 포즈를 취할 수도 있다.

    활성 선택 화면


    ViewModel


    private val share: Share by inject()
    val selected = share.testFlow.asLiveData()
    
    init {
        request.onEach {
            share.testSend(it)
        }.launchIn(viewModelScope)
    }
    
    여기 프로필 화면과 같이 SharedFlow를 구독하여 초기 선택의 값을 설정합니다.

    Fragment


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.lifecycleOwner = viewLifecycleOwner
        binding.viewModel = viewModel
    
        binding.button.setOnClickListener {
            viewModel.viewModelScope.launch { 
                share.testSend(viewModel.select)
            }
            findNavController().popBackStack()
        }
    }
    
    결정 버튼을 누른 후 SharedFlow에서 선택한 값 emit.
    이렇게 되면 프로필 화면의 ViewModel 구독 값도 변경됩니다.
    ※ ViewModelScope를 사용할 때는 emit와 함께 프로필 화면으로 돌아가기 때문에 ViewLifecycleScope를 사용하는 것보다 안전하다고 생각합니다.
    → 하면 어떨까???

    결론


    SharedFlow를 이용하면 원하는 곳에서 마음대로 구독할 수 있고 유형을 자유롭게 선택할 수 있어 개인적으로는 최고다.
    뷰모델도 더러워지지 않고 편하지 않아요?

    좋은 웹페이지 즐겨찾기