FragmentのrequireContext()

FragmentgetContext()はnullableだが、requireContext()メソッドでnullableではない値が取得できる。

requireContext().getString(R.string.foo)

ただしgetContext()で取得できるコンテキストの値がnullになっていると java.lang.IllegalStateExceptionがスローされる。

コールバックでrequireContext()を呼び出すとクラッシュすることがある

例えばボタンのsetOnClickListenrに渡すコールバック関数で requireContext()を実行すると状況によってクラッシュする可能性がある。

画面遷移中にコールバックが呼ばれるときなどはコンテキストの値がnullとなっているので、 java.lang.IllegalStateExceptionがスローされる。

somebutton.setOnClickListenr {
  // contextがnullの場合はjava.lang.IllegalStateExceptionがスローされる
  binding?.textView.text = requireContext().getString(R.string.foo)
}

対応方法

getContext()で取得される値がnullではないことをチェックしておけばオーケー。

somebutton.setOnClickListenr {
  if (context == null) {
    return@setOnClickListenr
  }
  binding?.textView.text = requireContext().getString(R.string.foo)
}

エルビス演算子を使ったnullチェックを使ってシンプルに書ける。

somebutton.setOnClickListenr {
  val c = context ?: return@setOnClickListenr
  binding?.textView.text = c.getString(R.string.foo)
}