https://developer.android.com/topic/libraries/architecture/livedata?hl=ko#create_livedata_objects
https://velog.io/@eoqkrskfk94/LiveData%EC%99%80-Flow
https://dev-imaec.tistory.com/39
https://dev-imaec.tistory.com/404
class C {
private val _elementList = mutableListOf<Element>()
val elementList : List<Element>
get() = _elementList
....
....
_elementList.value = ~~~ // 이런 식으로 Mutable의 값을 변경
}
// viewModel class 단에서 특정 타입의 data를 hold하고 있을 LiveData 객체 생성
// 단, MutableLiveData는 ViewModel에서 사용되며 ViewModel은 변경이 불가능한 LiveData 객체만 Observer 객체에게 노출 시킴. -> 이와 관련된건 다음 문단에서 서술
// ViewModel은 기본적으로 UI 관련 데이터를 로드하고 관리하는 역할을 하므로 LiveData 객체를 보유하는 데 적합. LiveData 객체를 ViewModel에 만들고 이를 사용하여 UI 레이어에 상태를 노출.
class NameViewModel : ViewModel() {
// Create a LiveData with a String
val currentName: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
// Rest of the ViewModel...
}
// 일반적으로 Activity 혹은 Fragment 단 같은 UI Controller에서 Observer 객체 생성
// Activity와 Fragment같은 UI Controller 단에서는 data 상태(State) 보유가 아닌 data를 표시하는 역할을 하므로 LiveData 인스턴스를 보유해서는 안됨.
class NameActivity : AppCompatActivity() {
// Use the 'by viewModels()' Kotlin property delegate
// from the activity-ktx artifact
private val viewModel: NameViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Other code to setup the activity...
// 액티비티단에서 Observer 객체 생성
// Create the observer which updates the UI.
val nameObserver = Observer<String> { newName ->
// LiveData 객체가 보유한 데이터 변경 시 발생하는 작업 제어
// Update the UI, in this case, a TextView.
nameTextView.text = newName
}
// viewModel의 MutableLiveData에 Observer객체를 연결하여 관찰하기 시작함.
// observe() 메소드를 이용해 LiveData 객체에 Observer 객체 연결 -> Observer 객체가 해당 LiveData 객체를 관찰 할 수 있게 됨.
// observe() 메소드는 LifeCycleOwner 객체 사용 -> Observer 객체가 LiveData 객체를 구독하여 변경사항에 관한 알림을 받을 수 있게 됨.
// Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
// currentName은 viewModel에서 선언한 MutableLiveData
viewModel.currentName.observe(this, nameObserver)
}
}
// ViewModel에서 LiveData에 대한 데이터 관리
class NumberViewModel : ViewModel() {
// MutableLiveData는 ViewModel에서 관리
// MutableLiveData는 값이 변경되기에 underscore를 붙임
private val _curNumber = MutableLiveData<Int>()
// LiveData
// ViewModel class 외부에서 MutableLiveData에 access하기 위해서는
// 값 변경이 불가능한 일반 LiveData 변수의 getter를 통해서
// MutableLiveData 값에 접근해 가져오게 된다.
// 리턴타입은 Int LiveData
val curNumber : LiveData<Int>
get() = _curNumber
init {
// 초기값 설정
_curNumber.value = 0
}
fun calculation(option : String, inputValue : Int) {
when (option) {
"+" ->
_curNumber.value = _curNumber.value?.plus(inputValue)
"-" ->
_curNumber.value = _curNumber.value?.minus(inputValue)
}
}
}