0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Android】Compose 1.8 ではジェスチャーナビゲーションを操作するだけで Dialog の onDismissRequest が呼ばれてしまう件

Last updated at Posted at 2025-07-04

Jetpack Compose 1.8 がリリースされてからそれなりに経っていますが、まんまとバグを踏んでしまったので備忘録として投稿します。

現象

DialogonDismissRequest は、ダイアログがユーザーによって閉じられようとしたときに呼ばれるもので、以下の場合にトリガーされます。

  1. ユーザーがダイアログの外側をタップする
  2. 「戻る」ボタンを押す

(※ DialogPropertiesdismissOnClickOutside 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.8.0-alpha03.gif 1.8.0-alpha04.gif 1.8.0-alpha05.gif 1.8.3.gif

対処方法

1.9.0-alpha01 でバグ修正されていました。どうしても対処したい場合は正式リリース前の 1.9.0 に上げてしまうのが無難でしょうか。

(応急処置としては DialogPropertiesdismissOnClickOutside = false にしてしまえば回避はできます。外側タップで閉じない挙動に変わりますが。)

Version 1.9.0-alpha01

Fixed bug where any motion event caught outside of a dialog could dismiss the dialog. (Ia78fd)

おわりに

Compose 1.8 ではジェスチャーナビゲーションを操作するだけで DialogonDismissRequest が呼ばれてしまうバグについて記載しました。

Compose、色々と勢いがありますね。
Changelog に目を通すことの重要さを再確認しました。

この記事の内容がどこかの誰かの役に立てば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?