如何在伴生对象中调用Jetpack Compose组件?ViewModel相关疑问
关于Jetpack Compose的两个问题解答
1. 伴生对象中调用Composable组件的问题
可以在伴生对象里调用Composable,但你的代码存在核心问题:你只创建了ComposeView实例,却没有将它挂载到实际的窗口容器中,这就是触发isAttachedToWindow=false的原因。
正确的做法是把ComposeView作为内容添加到Dialog的Window层级里,示例代码如下:
companion object { fun showDialog(context: Context) { AlertDialog.Builder(context).apply { setView(ComposeView(context).apply { setContent { CustomDialog(progressIndicator = false) } }) }.show() } }
如果想用纯Compose风格实现,也可以把显示逻辑封装成顶层Composable,通过状态控制显示时机;但如果要在伴生对象这类非Composable环境调用,上面的View系Dialog写法更直接可行。
2. CustomDialog的数据与回调是否需要ViewModel
不是必须,要根据业务场景判断:
- 简单交互场景:如果只是基础的按钮回调、静态数据展示,直接给
CustomDialog传参数和lambda回调即可,不需要ViewModel。比如:@Composable fun CustomDialog( progressIndicator: Boolean, onConfirm: () -> Unit, onDismiss: () -> Unit ) { // Dialog布局与交互逻辑 } - 复杂状态场景:如果Dialog需要和宿主页面共享状态、处理异步数据请求,或者要在屏幕旋转等配置变更时保留状态,使用ViewModel会更合适。ViewModel能帮你统一管理数据逻辑,避免状态丢失,同时让Dialog与宿主页面的逻辑解耦。
内容的提问来源于stack exchange,提问作者Slava
相关产品推荐
相关产品推荐

