【问题标题】:LazyColumn inside Alertdialog shows error in Jetpack ComposeAlertdialog 中的 LazyColumn 在 Jetpack Compose 中显示错误
【发布时间】:2022-07-06 19:39:51
【问题描述】:

我正在尝试在警报对话框中显示LazyColumn,以便用户可以在项目列表之间进行选择,然后单击它。警报对话框将毫无问题地显示,我可以单击屏幕上的任何项目并将其关闭,但是当我尝试在项目之间滚动时,它将给出以下错误:

E/InputEventReceiver: Exception dispatching input event.
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.app, PID: 22418
    java.lang.IllegalArgumentException: Failed requirement.
        at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure(MeasureAndLayoutDelegate.kt:177)
        at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:228)
        at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:38)
        at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:201)
        at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:662)
        at androidx.compose.ui.platform.AndroidComposeView.handleMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1073)
        at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(AndroidComposeView.android.kt:1059)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594)
        at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:913)
        at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1957)
        at android.app.Dialog.dispatchTouchEvent(Dialog.java:1162)
        at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:871)
        at android.view.View.dispatchPointerEvent(View.java:15458)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:7457)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:7233)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6595)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6652)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6618)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6786)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6626)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6843)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6599)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6652)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6618)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6626)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6599)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:9880)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:9718)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:9671)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:10014)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:220)
        at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
        at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:200)
        at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:9960)
        at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:10056)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1010)
        at android.view.Choreographer.doCallbacks(Choreographer.java:809)
        at android.view.Choreographer.doFrame(Choreographer.java:737)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:995)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:246)
        at android.app.ActivityThread.main(ActivityThread.java:8595)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
I/Process: Sending signal. PID: 22418 SIG: 9

这是AlertDialog 代码:

AlertDialog(
    onDismissRequest = { showDialog.value = false },
    modifier = Modifier.fillMaxHeight(.80f),
    text = {
        LazyColumn{
            items(30){ i ->
                Text(text = i.toString())
            }
        }
    },
    buttons = {
            Button(onClick = { /*TODO*/ }) {
                Text(text = "Cancel")
            }
    }
)

【问题讨论】:

  • 您使用的是哪个撰写版本?
  • 我可以用androidx.compose.material:material:1.2.0-alpha01 复制它。请report它来编写问题跟踪器,因为它是一个错误。
  • 使用androidx.compose.material:material:1.1.0-rc01,以为报错,报错。

标签: kotlin android-alertdialog android-jetpack-compose lazycolumn


【解决方案1】:

虽然我发现如果我使用 Material3 库滚动不再是问题,但我也遇到了同样的问题:

实现“androidx.compose.material3:material3:1.0.0-alpha03”

AlertDialog(
        onDismissRequest = { },
        modifier = Modifier.fillMaxHeight(0.8f),
        text = {
            LazyColumn() {
                items(30) { i ->
                    Text(text = i.toString())
                }
            }
        },
        dismissButton = {
            Button(onClick = { /*TODO*/ }) {
                Text(text = "Cancel")
            }
        }
    )

确保导入:

导入 androidx.compose.material3.AlertDialog

我不知道这是否是正确的答案,但我希望它在任何情况下都会有所帮助。

【讨论】:

    【解决方案2】:

    另一种解决方法是使用基础androidx.compose.ui.window.Dialog。这个Dialog 在使用LazyColumn 时不会崩溃:

    @Composable
    @Preview(showBackground = true)
    fun SimpleDialog(onDismissRequest: () -> Unit = {}) {
        Dialog(
            onDismissRequest = onDismissRequest,
            content = {
                Surface(shape = RoundedCornerShape(8.dp)) {
                    Column(
                        modifier = Modifier.padding(8.dp),
                    ) {
                        Text(text = "Simple Dialog", style = MaterialTheme.typography.h6)
                        LazyColumn(
                            modifier = Modifier.height(150.dp),
                            content = {
                                items(30){ i ->
                                    Text(text = i.toString())
                                }
                            }
                        )
                        Button(onClick = onDismissRequest) {
                            Text("Cancel")
                        }
                    }
                }
            },
        )
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 2021-12-28
      • 2021-11-30
      • 2021-06-01
      • 2022-09-26
      • 1970-01-01
      • 2022-07-29
      相关资源
      最近更新 更多