리뉴얼 개발 중 Delegates.observable() 이란 것을 알게됨

UI처리할 때 유용할거라고

Delegates를 보고 iOS 잠깐 공부할때 델리게이트란걸 들었어서 비슷한건가 했는데 맞는듯

찾아보다가 Delegate Pattern이란걸 알게 되었는데

<aside> 💡 Delegate Pattern 어떠한 기능을 자신이 아닌 다른 객체에 위임해서 처리하는 pattern

(정의도 그렇고 찾아보니 상속과 비슷한거같은데 자세한건 다음 시간에..)

</aside>

by 키워드를 사용해서 프로퍼티를 observable 하게 만들어준다.

// Kotlinlang.org
inline fun <T> observable(
    initialValue: T, 
    crossinline onChange: (property: KProperty<*>, oldValue: T, newValue: T) -> Unit
): ReadWriteProperty<Any?, T>

초기 value와 onChange라는 리스너를 받고있고, onChange 메서드는 value가 변경될 때 마다 호출된다.

스크린샷 2023-03-04 오후 7.33.52.png

본인은 평소에 아래와 같이 사용함

// 이벤트에 따른 버튼 활성화-비활성화 리소스 적용
private fun setBackgroundDrawable(isEnable: Boolean) {
	if (isEnable) {
	} else {
	}
}

Delegates.observable 방식으로 바꿔보았다.

// example
private var isBtnEnable: Boolean by Delegates.observable(initialValue = false) { property, oldValue, newValue -> 
  binding.btnView.background = if (newValue) {
		ContextCompat.getDrawable(this, R.drawable.drawable_source_1)
	} else {
		ContextCompat.getDrawable(this, R.drawable.drawable_source_2)
	}
}

isBtnEnable = false // call listener
isBtnEnable = true // call listener

(뭔가 RxJava로 EventBus 사용하는 것 같은 느낌..?)