🚦
Jetpack Compose (MD2): ModalBottomSheetを確実に閉じる
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