🚦

Jetpack Compose (MD2): ModalBottomSheetを確実に閉じる

2022/11/17に公開

ModalBottomSheetを確実に閉じる

ケース

Material Design 2でModalBottomSheetを使っていてコード側からそのシートを閉じたい時には、ModalBottomSheetState#hide()を叩くことで閉じられる。しかし、IMEを閉じている最中など、特定のタイミングでは呼び出したにも関わらずシートを閉じられない場合がある。
UiState側との乖離を避けるためにもこれはなるべく防ぎたい。

解決策

失敗時には ModalBottomSheetState#hide() がキャンセルされているので、それに合わせてdelayしたのち再度 ModalBottomSheetState#hide() を呼び出すような拡張メソッドを定義する。

suspend fun ModalBottomSheetState.forceHide(): Boolean = forceHide(retry = 3)

private suspend fun ModalBottomSheetState.forceHide(retry: Int): Boolean =
  try {
    val shouldTryToHide = retry > 0
    if (shouldTryToHide) {
      hide()
    }

    shouldTryToHide
  } catch (_: CancellationException) {
    delay(4 * 1000 / 60)
    forceHide(retry - 1)
  }

Discussion