마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

two-way 질문 올린 사람인데요 죄송한데 조금만 더 질문하겠습니다.

0 추천
함수를 하나 공개해서라는 것은 어떤 형태로 만들어야 하는 건가요?

private val mldText = MutableLiveData<String>()

fun setText(view : View){

     mldText.value = (view as EditText).text

} 일단 함수 안을 어떻게 해야되는지 잘 감이안오네요.

그리고 xml에서는 @{() -> viewModel.setTest()} 어떻게 넣어줘야 하나요? 아주 간단한 예문이라도 부탁드리겠습니다.
related to an answer for: mvvm에서 two-way 방식
키리링 (840 포인트) 님이 2022년 9월 7일 질문

1개의 답변

+1 추천
 
채택된 답변

예제로 올리신 코드가 설명을 하기에 적절하지 않아 보입니다. LiveData 만 변경할 거면 굳이 LiveData를 사용할 이유가 없어 보입니다. 예제를 조금 변경하여 사용자 이름을 변경하는 걸 가지고 설명을 하겠습니다.

class UserViewModel(
    private val userRepository: UserRepository
) : ViewModel() {

    private _viewState = MutableLiveData<UserViewState>()
    val viewState: LiveData<UserViewState> get()  = _userNameState

    fun onUserNameChanged(userName: String) {
       viewModelScope.launch {
             val isSuccess = userRepository.updateUserName(userName)
             if (!isSuccess)   {
                    return@launch _viewState.postValue(UserViewState.Error("에러메세지"))
            }

            _viewState.postValue(UserViewState.Success(userName))
       }
   }
}

sealed class UserViewState {
    data class Success(val userName: String): UserViewState()
    data class Error(val String): UserViewState()
}

사용자 이름을 업데이트 할 수 있는 onUserNameChanged 함수를 뷰쪽에 공개하고 뷰에서 저장 버튼을 누르거나 하는 액션이 있을 때, 해당 함수를 호출한다고 생각하시면 됩니다. ViewModel에서는 UserRepository라는 서버에 사용자 이름을 업데이트하는 기능을 하는 Repository인스턴스의 함수를 호출하고 결과값에 따라 에러나 성공을 뷰쪽으로 보내는 간단한 코드입니다.

 뷰는 viewState를 observe하고 있으면 자동으로 결과값을 통보받겠죠. 항상 이런식으로 뷰쪽에서 액션을 발생시키고 처리한 결과를 뷰쪽에 상태를 보관하는 데이터클래스 등을 통해 알려주는 패턴을 사용합니다.

spark (227,830 포인트) 님이 2022년 9월 7일 답변
키리링님이 2022년 9월 9일 채택됨
질문을 보니까 데이터바인딩과 LiveData를 헷갈리시는 것 같네요. 둘은 다른 요소입니다. 데이터바인딩의 사용은 다릅니다. 저는 개인적으로 데이터 바인딩은 사용하지 않으므로 거기에 대한 답은 아닙니다.
...