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

ViewModel 상속 관련 질문있습니다!

0 추천
open class BaseRecyclerItemViewModel: ViewModel() {
    val evaluationList = MutableLiveData<ArrayList<EvaluationData?>>()
    val evaluationListAccessor: LiveData<ArrayList<EvaluationData?>>
        get() = evaluationList
    val delayTime = 200L

    init {
        loading()
    }

    fun loading() {
        evaluationList.value = arrayListOf(null)
    }
}

이런 식으로 viewModel을 open class로 만든 뒤에

다른 viewModel에서 상속받아서 사용해도 될까요?

class EvaluationViewModel(private val evaluationRepository: EvaluationRepository) : BaseRecyclerItemViewModel() {
    private val _selectedType = MutableLiveData<String>()

    private fun loadEvaluationData() {
        viewModelScope.launch {
            val response = evaluationRepository.getLectureMainList(_selectedType.value.toString())

 

EvaluationViewModel은 BaseRecyclerItemViewModel을 상속받았습니다. 

koownij (210 포인트) 님이 2022년 4월 7일 질문
BaseActivity, BaseFragment, BaseViewModel 같이 상속을 사용하는 게 당장은 편한데, 조금만 지나면 코드의 종속성이 심해지기 때문에 변경이 점점 더 어려워집니다. 많은 개발자들이 안드로이드의 이런 상속을 안티패턴으로 보는 경향이 늘고 있어요. Extension함수나, 인터페이스를 사용하거나 클래스를 만들어서 필요한 기능을 옮기는 형태로 코드를 구성하는게 유연합니다.

1개의 답변

+1 추천
 
채택된 답변
class EvaluationDataEmitter {

      private val mutableEvaluationList = MutableLiveData<List<EvaluationData>>()
      val evaluationList: LiveData<List<EvaluationData>>
            get() = mutableEvaluationList

      fun emit(items: List<EvaluationData>) {
          mutableEvaluationList.postValue(item)
      }
}

여러가지 방법 중에 위처럼 해당 기능을 공유할 수 있는 코드를 가진 클래스를 만들어 사용할 수 있습니다.
 

class EvaluationViewModel(
       private val evaluationDataEmitter: EvaluationDataEmitter = EvaluationDataEmitter(),
       private val evaluationRepository: EvaluationRepository
) : ViewModel() {
   ...

}

 

spark (227,530 포인트) 님이 2022년 4월 7일 답변
koownij님이 2022년 4월 7일 채택됨
예제 코드까지... 정말 감사합니다!
이렇게 코드를 짤 수도 있네요! 덕분에 시야가 넓어진거같습니다! 정말 감사합니다!!
...