단방향 Data Flow

안드로이드 앱에서 상태는 사용자 이벤트에 대한 응답으로 업데이트가 이루어진다.

Untitled

기존의 구조화 되지 않은 상태

879ed27ccab2eed3 (1).gif

class HelloActivity : AppCompatActivity() {
   private lateinit var binding: ActivityHelloBinding
   var name = ""

   override fun onCreate(savedInstanceState: Bundle?) {
       binding.textInput.doAfterTextChanged {text ->
           name = text.toString()
           updateHello()
       }
   }

   private fun updateHello() { binding.helloText.text = "Hello, $name" }
}

→ 이와 같은 코드는 UI가 늘어나면서 관리하기 어려워짐

ViewModel를 사용한 단방향 Data Flow 의 상태

class HelloViewModel: ViewModel() {
   private val _name = MutableLiveData("")
   val name: LiveData<String> = _name

   fun onNameChanged(newName: String) { _name.value = newName }
}

class HelloActivityWithViewModel : AppCompatActivity() {
   private val helloViewModel by viewModels<HelloViewModel>()

   override fun onCreate(savedInstanceState: Bundle?) {
       binding.textInput.doAfterTextChanged {
           helloViewModel.onNameChanged(it.toString())
       }

       helloViewModel.name.observe(this) { name ->
           binding.helloText.text = "Hello, $name"
       }
   }
}

Untitled

이러한 패턴을 Unidirectional data flow 이라고 함