Jetpack Compose 1.8 がリリースされてからそれなりに経っていますが、まんまとバグを踏んでしまったので備忘録として投稿します。
現象
Dialog
の onDismissRequest
は、ダイアログがユーザーによって閉じられようとしたときに呼ばれるもので、以下の場合にトリガーされます。
- ユーザーがダイアログの外側をタップする
- 「戻る」ボタンを押す
(※ DialogProperties
の dismissOnClickOutside
dismissOnBackPress
で無効にすることも可能)
Compose 1.7 まではジェスチャーナビゲーションを操作しても 1 の外側タップはトリガーされませんでしたが、1.8 ではトリガーされるようになっています。
正確には、1.8.0-alpha03
までは問題がなく、1.8.0-alpha04
から発生しています。
バージョンによる比較検証
ダイアログを表示した状態で、ジェスチャーナビゲーションを操作して比較してみます。
以下のサンプルコードで検証しました。ただダイアログを表示するシンプルなものです。
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
MyApplicationTheme {
var showDialog by remember { mutableStateOf(true) }
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center,
) {
if (showDialog) {
MyDialog(
onDismissRequest = {
showDialog = false
}
)
}
Button(
onClick = {
showDialog = true
}
) {
Text("Show Alert Dialog")
}
}
}
}
}
}
@Composable
fun MyDialog(onDismissRequest: () -> Unit) {
Dialog(
onDismissRequest = onDismissRequest,
) {
Card(
modifier = Modifier
.size(200.dp),
shape = RoundedCornerShape(16.dp),
) {
Text(
text = "Dialog Content",
modifier = Modifier
.fillMaxSize()
.wrapContentSize(Alignment.Center),
textAlign = TextAlign.Center,
)
}
}
}
検証動画
上記サンプルコードを実行し、ジェスチャーナビゲーションを操作した様子です。
(ダイアログに Compose のバージョンを表示するようにだけ手を加えています。)
alpha04
ではジェスチャーナビゲーションを操作した後にダイアログが閉じる挙動になり、alpha05
からはジェスチャーナビゲーションを触った時点で閉じる挙動に変わりました。最新版の 1.8.3
でも引き続き再現しています。
1.8.0-alpha03 | 1.8.0-alpha04 | 1.8.0-alpha05 | 1.8.3 |
---|---|---|---|
正常 | 操作後に閉じる | 触った時点で閉じる | 触った時点で閉じる |
![]() |
![]() |
![]() |
![]() |
対処方法
1.9.0-alpha01
でバグ修正されていました。どうしても対処したい場合は正式リリース前の 1.9.0 に上げてしまうのが無難でしょうか。
(応急処置としては DialogProperties
で dismissOnClickOutside = false
にしてしまえば回避はできます。外側タップで閉じない挙動に変わりますが。)
Fixed bug where any motion event caught outside of a dialog could dismiss the dialog. (Ia78fd)

おわりに
Compose 1.8 ではジェスチャーナビゲーションを操作するだけで Dialog
の onDismissRequest
が呼ばれてしまうバグについて記載しました。
Compose、色々と勢いがありますね。
Changelog に目を通すことの重要さを再確認しました。
この記事の内容がどこかの誰かの役に立てば幸いです。