View model & view model factory setup

This commit is contained in:
2020-03-11 10:05:44 -04:00
parent bea438c29d
commit de3a47f4c8
3 changed files with 69 additions and 3 deletions

View File

@@ -22,6 +22,8 @@ import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.example.android.guesstheword.R
@@ -32,6 +34,9 @@ import com.example.android.guesstheword.databinding.ScoreFragmentBinding
*/
class ScoreFragment : Fragment() {
private lateinit var viewModel: ScoreViewModel
private lateinit var viewModelFactory: ScoreViewModelFactory
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -46,15 +51,30 @@ class ScoreFragment : Fragment() {
false
)
// Get args using by navArgs property delegate
val scoreFragmentArgs by navArgs<ScoreFragmentArgs>()
binding.scoreText.text = scoreFragmentArgs.score.toString()
binding.playAgainButton.setOnClickListener { onPlayAgain() }
viewModelFactory = ScoreViewModelFactory(scoreFragmentArgs.score)
viewModel = ViewModelProviders.of(this, viewModelFactory)
.get(ScoreViewModel::class.java)
viewModel.score.observe(this, Observer {
binding.scoreText.text = getString(R.string.score_format, it)
})
viewModel.eventPlayAgain.observe(this, Observer {
if (it) {
onPlayAgain()
}
})
binding.playAgainButton.setOnClickListener {
viewModel.playAgain()
}
return binding.root
}
private fun onPlayAgain() {
findNavController().navigate(ScoreFragmentDirections.actionRestart())
viewModel.onPlayAgainComplete()
}
}

View File

@@ -0,0 +1,33 @@
package com.example.android.guesstheword.screens.score
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import timber.log.Timber
class ScoreViewModel(var finalScore: Int): ViewModel() {
private val _score = MutableLiveData<Int>()
val score: LiveData<Int>
get() = _score
private val _eventPlayAgain = MutableLiveData<Boolean>()
val eventPlayAgain: LiveData<Boolean>
get() = _eventPlayAgain
init {
Timber.i("finalScore: $finalScore")
_eventPlayAgain.value = false
_score.value = finalScore
}
fun playAgain() {
_eventPlayAgain.value = true
}
fun onPlayAgainComplete() {
_eventPlayAgain.value = false
}
}

View File

@@ -0,0 +1,13 @@
package com.example.android.guesstheword.screens.score
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
class ScoreViewModelFactory(private val finalScore: Int) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(ScoreViewModel::class.java)) {
// TODO Construct and return the ScoreViewModel
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}