ViewModel

sumi Yoo·2022년 9월 13일

gradle 추가

implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.0-alpha01'

Android Developer

by viewModels()

by viewModels()을 사용하려면 아래 종속성도 추가해주어야 한다.

android {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}
 
dependencies {
    implementation 'androidx.activity:activity-ktx:1.1.0'
    implementation 'androidx.fragment:fragment-ktx:1.2.5'
}

참고사이트

MyViewModel

class MyViewModel: ViewModel() {
    val score = MutableLiveData<Int>(1)
    /*: MutableLiveData<Int> by lazy {
        MutableLiveData<Int>(1)
    }*/
    fun scorePlus() {
        score.value = (score.value ?:0) + 1
    }
    fun scoreMinus() {
        score.value = (score.value ?:0) - 1
    }
}

viewModel Fragment끼리 공유하기

Fragment1

class Fragment1: Fragment() {
    lateinit var binding:Fragment1Binding
    private val model: MyViewModel by activityViewModels()
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = Fragment1Binding.inflate(inflater,container,false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.button.setOnClickListener {
            model.scorePlus()
        }
        binding.button2.setOnClickListener {
            model.scoreMinus()
        }
    }
}

Fragment2

class Fragment2: Fragment() {
    lateinit var binding:Fragment2Binding
    private val model: MyViewModel by activityViewModels()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = Fragment2Binding.inflate(inflater,container,false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        model.score.observe(viewLifecycleOwner, Observer {
            binding.textView.text = it.toString()
        })
    }
}

MainActivity

class MainActivity : AppCompatActivity() {
    private var binding: ActivityMainBinding? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding?.root)
    }
}

Android Developer

0개의 댓글