今度こそ画面回転してもデータが無くならないようにしましょう。

$ git clone git@github.com:saitoyusuke/using_viewmodel_incorrectly.git
$ cd using_viewmodel_incorrectly
$ git checkout 07cbff916075c9845940e69a52a9f1d0667357a1
   implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
class MainViewModel : ViewModel() {
    private val _count: MutableLiveData<Int> = MutableLiveData(0)
    val count: LiveData<Int> = _count

    fun countUp() {
        _count.postValue(_count.value?.plus(1))
    }
}
class MainActivity : AppCompatActivity() {

    private lateinit var viewBinding: ActivityMainBinding
    private val viewModel: MainViewModel by lazy { ViewModelProvider(this).get(MainViewModel::class.java) }

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

        viewBinding.countUp.setOnClickListener {
            viewModel.countUp()
        }

        viewModel.count.observe(this) { count ->
            viewBinding.countView.text = count.toString()
        }
    }
}

実際に動かしてみましょう。

やっと画面回転してもデータが保持されるようになりました!なぜ今回の変更でデータが保持されるようになったかというと「ViewModelがいつまでデータを保持したら良いか(ViewModelProvider)」を指定したためです。それまではViewModelがいつまでデータを保持したら良いかわからなかったので、Activityが再生成されると、ViewModel自体も再生成されていましたが、ViewModelProviderを使うことでいつデータを破棄したら良いかをViewModelが知れるようになったのです。

このようにViewModelを知っているつもりでもちゃんと使い方を知らないと画面回転しても正しく動作しません。ViewModelだけではなく、DaggerHilt(DependencyInjection)やRx○○、CoroutineFlow等、なぜそのライブラリを使うのか、使うことでどういったメリットがあるのか、正しく扱うにはどうしたらよいのか、よく検討してから入れるようにしましょう。ただ流行っているから、みんな使っているからという理由でライブラリを入れることはバグを発生させ、開発スピードを遅くさせてしまいます。