본문 바로가기
Kotlin

[ViewModel] ViewModel이란?

by 명훈스토리 2023. 2. 3.
SMALL

1. ViewModel이란?

ViewModel은 간단히 말하면 UI 와 로직의 분리를 위한 개념이다. Activity, Fragment 생명주기의 영향을 받지 않고 가로모드, 세로모드로 변경해도 값이 초기화되지 않고 유지시킬 수 있는게 ViewModel이다. 단, ViewModel에서 context나 activity객체를 사용하고 싶으면 AndroidViewModel()을 사용해야 한다.

 

2. 앱 gradle 추가

implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'

 

3. ViewModel 클래스

import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

enum class ActionType {
    PLUS, MINUS
}

class MainViewModel: ViewModel() {

    companion object {
        const val TAG: String = "로그"
    }

    private val _currentValue = MutableLiveData<Int>()
    val currentValue: LiveData<Int>
        get() = _currentValue

    init {
        Log.d(TAG, " MainViewModel - 생성자 호출")
        _currentValue.value = 0
    }

    fun updateValue(actionType: ActionType, input: Int) {
        when(actionType) {
            ActionType.PLUS ->
                _currentValue.value = _currentValue.value?.plus(input)
            ActionType.MINUS ->
                _currentValue.value = _currentValue.value?.minus(input)
        }
    }

}

 

4. MainActivity

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.View.OnClickListener
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import com.example.viewmodel.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity(), OnClickListener {

    companion object {
        const val TAG: String = "로그"
    }

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    lateinit var mainViewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)
        mainViewModel.currentValue.observe(this, Observer {
            Log.d(TAG, "MainActivity - mainViewModel - CurrentValue 라이브 데이터 값 변경 : ")
            binding.tvNumber.text = it.toString()
        })

        binding.btnPlus.setOnClickListener(this)
        binding.btnMinus.setOnClickListener(this)
    }

    override fun onClick(view: View?) {
        if (binding.etNumber.text.toString().isNotEmpty()) {
            val userInput: Int = binding.etNumber.text.toString().toInt()

            when(view) {
                binding.btnPlus ->
                    mainViewModel.updateValue(actionType = ActionType.PLUS, userInput)
                binding.btnMinus ->
                    mainViewModel.updateValue(actionType = ActionType.MINUS, userInput)
            }
        }
    }
}

 

LIST

'Kotlin' 카테고리의 다른 글

[Paging] Paging 사용법  (0) 2023.02.05
[Paging] Paging이란?  (0) 2023.02.03
[LifeCycles] LifeCycles란?  (0) 2023.02.03
[Coroutine] Coroutine이란?  (0) 2023.02.02
[TIL] Room DB 사용법  (0) 2023.02.02

댓글