はじめに
Compose で用意されている AlertDialog の仕組みがダサすぎる
Web 系のアプリでよく見かけるダイアログの仕組みをまんま Compose で実装したものでダイアログを開く/閉じるの操作が全く受け入れられない
ならば、従来の View 系 AlertDialog の View を Compose で定義して使えたらいいなと思い試してみた
先に結論
ComposeView で view に変換するまではできるが Activity や Fragment が裏でやっている View のライフサイクルを ComposeView に伝搬させることができない理由で実行時エラーで落ちる
からと言って、親に Fragment を定義するとなると大げさすぎるし、そこまでして Compose を使いたいとも思わない
試したコード
fun showComposeDialog(activity: Activity) {
val composeView = ComposeView(activity).apply {
setContent {
Text("Hello, Compose!")
}
}
val dialog = AlertDialog.Builder(activity)
.setView(composeView)
.setPositiveButton("OK") { dialog, _ ->
dialog.dismiss()
}
.setPositiveButton("OK") { dialog, which ->
dialog.dismiss()
}
.setNegativeButton("Cancel") { dialog, which ->
dialog.dismiss()
}
.create()
dialog.show()
}
もちろん上のコードは実行時エラーで落ちるので使い物にならない
なんとかならないか?と思い試したが、結局エラーが出る
エラー内容
java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from android.widget.LinearLayout
まとめ
もともとの仕組みがダサく、応用して組み合わせる方法も裏の実装が不十分で実現不可能!
なんとも不満な結果で気に入らん