Jetpack Compose 如何删除 LazyColumn 中的聚焦 TextField
Jetpack Compose how to remove focused TextField inside LazyColumn
假设我有一个 LazyColumn
带有文本字段和用于切换文本字段是否可用的按钮。
LazyColumn() {
item {
var text by remember { mutableStateOf("Hello") }
if (myViewModel.showTextField.value) {
TextField(value = text, onValueChange = { text = it })
}
TextButton(onClick = { myViewModel.toggleField() }) {
Text(text = "toggle")
}
}
}
而 viewModel 有这样的代码
class MyViewModel : ViewModel() {
private val _showTextField = mutableStateOf(true)
val showTextField : State<Boolean> = _showTextField
fun toggleField() {
_showTextField.value = !showTextField.value
}
}
现在,当我在单击切换按钮之前单击 TextField 时。所以 TextField
在删除它之前有焦点,应用程序崩溃并出现以下错误:
2022-04-09 19:43:03.417 12336-12336/com.courtesy.test E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.courtesy.test, PID: 12336
java.lang.IllegalStateException: LayoutCoordinates androidx.compose.ui.node.ModifierLocalConsumerNode@bab1d96 is not attached!
at androidx.compose.ui.node.LayoutNodeWrapper.localBoundingBoxOf(LayoutNodeWrapper.kt:714)
at androidx.compose.foundation.gestures.ContentInViewModifier.onSizeChanged-O0kMr_c(Scrollable.kt:524)
at androidx.compose.foundation.gestures.ContentInViewModifier.onRemeasured-ozmzZPI(Scrollable.kt:492)
at androidx.compose.ui.node.LayoutNodeWrapper$onMeasured$invokeRemeasureCallbacks.invoke(LayoutNodeWrapper.kt:244)
at androidx.compose.ui.node.LayoutNodeWrapper$onMeasured$invokeRemeasureCallbacks.invoke(LayoutNodeWrapper.kt:242)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.withNoObservations(SnapshotStateObserver.kt:142)
at androidx.compose.ui.node.OwnerSnapshotObserver.withNoSnapshotReadObservation$ui_release(OwnerSnapshotObserver.kt:55)
at androidx.compose.ui.node.LayoutNodeWrapper.onMeasured(LayoutNodeWrapper.kt:247)
at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:107)
at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier.measure-3p2s80s(GraphicsLayerModifier.kt:405)
at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:40)
at androidx.compose.ui.node.LayoutNode$performMeasure.invoke(LayoutNode.kt:1342)
at androidx.compose.ui.node.LayoutNode$performMeasure.invoke(LayoutNode.kt:1341)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:1918)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:121)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:88)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:76)
at androidx.compose.ui.node.LayoutNode.performMeasure-BRTryo0$ui_release(LayoutNode.kt:1341)
at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.kt:94)
at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release(LayoutNode.kt:1295)
at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release$default(LayoutNode.kt:1291)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-sdFAvZA(MeasureAndLayoutDelegate.kt:180)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:256)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:36)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:201)
at androidx.compose.ui.platform.AndroidComposeView.onMeasure(AndroidComposeView.android.kt:756)
at android.view.View.measure(View.java:25466)
at androidx.compose.ui.platform.AbstractComposeView.internalOnMeasure$ui_release(ComposeView.android.kt:298)
at androidx.compose.ui.platform.AbstractComposeView.onMeasure(ComposeView.android.kt:285)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:145)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
2022-04-09 19:43:03.418 12336-12336/com.courtesy.test E/AndroidRuntime: at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:747)
at android.view.View.measure(View.java:25466)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3397)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2228)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2486)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:731)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
2022-04-09 19:43:03.816 12336-12336/com.courtesy.test I/Process: Sending signal. PID: 12336 SIG: 9
当我在点击按钮之前没有点击 TextField
时它工作正常。
如果我使用 Column
而不是 LazyColumn
,一切都会正常工作。
有什么解决这个问题的想法吗?
已通过将撰写版本从 1.2.0-alpha06 更改为 1.2.0-alpha07
来修复
假设我有一个 LazyColumn
带有文本字段和用于切换文本字段是否可用的按钮。
LazyColumn() {
item {
var text by remember { mutableStateOf("Hello") }
if (myViewModel.showTextField.value) {
TextField(value = text, onValueChange = { text = it })
}
TextButton(onClick = { myViewModel.toggleField() }) {
Text(text = "toggle")
}
}
}
而 viewModel 有这样的代码
class MyViewModel : ViewModel() {
private val _showTextField = mutableStateOf(true)
val showTextField : State<Boolean> = _showTextField
fun toggleField() {
_showTextField.value = !showTextField.value
}
}
现在,当我在单击切换按钮之前单击 TextField 时。所以 TextField
在删除它之前有焦点,应用程序崩溃并出现以下错误:
2022-04-09 19:43:03.417 12336-12336/com.courtesy.test E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.courtesy.test, PID: 12336
java.lang.IllegalStateException: LayoutCoordinates androidx.compose.ui.node.ModifierLocalConsumerNode@bab1d96 is not attached!
at androidx.compose.ui.node.LayoutNodeWrapper.localBoundingBoxOf(LayoutNodeWrapper.kt:714)
at androidx.compose.foundation.gestures.ContentInViewModifier.onSizeChanged-O0kMr_c(Scrollable.kt:524)
at androidx.compose.foundation.gestures.ContentInViewModifier.onRemeasured-ozmzZPI(Scrollable.kt:492)
at androidx.compose.ui.node.LayoutNodeWrapper$onMeasured$invokeRemeasureCallbacks.invoke(LayoutNodeWrapper.kt:244)
at androidx.compose.ui.node.LayoutNodeWrapper$onMeasured$invokeRemeasureCallbacks.invoke(LayoutNodeWrapper.kt:242)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.withNoObservations(SnapshotStateObserver.kt:142)
at androidx.compose.ui.node.OwnerSnapshotObserver.withNoSnapshotReadObservation$ui_release(OwnerSnapshotObserver.kt:55)
at androidx.compose.ui.node.LayoutNodeWrapper.onMeasured(LayoutNodeWrapper.kt:247)
at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:107)
at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier.measure-3p2s80s(GraphicsLayerModifier.kt:405)
at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:40)
at androidx.compose.ui.node.LayoutNode$performMeasure.invoke(LayoutNode.kt:1342)
at androidx.compose.ui.node.LayoutNode$performMeasure.invoke(LayoutNode.kt:1341)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:1918)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:121)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:88)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:76)
at androidx.compose.ui.node.LayoutNode.performMeasure-BRTryo0$ui_release(LayoutNode.kt:1341)
at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.kt:94)
at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release(LayoutNode.kt:1295)
at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release$default(LayoutNode.kt:1291)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-sdFAvZA(MeasureAndLayoutDelegate.kt:180)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:256)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:36)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:201)
at androidx.compose.ui.platform.AndroidComposeView.onMeasure(AndroidComposeView.android.kt:756)
at android.view.View.measure(View.java:25466)
at androidx.compose.ui.platform.AbstractComposeView.internalOnMeasure$ui_release(ComposeView.android.kt:298)
at androidx.compose.ui.platform.AbstractComposeView.onMeasure(ComposeView.android.kt:285)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:145)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
2022-04-09 19:43:03.418 12336-12336/com.courtesy.test E/AndroidRuntime: at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:747)
at android.view.View.measure(View.java:25466)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3397)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2228)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2486)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:731)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
2022-04-09 19:43:03.816 12336-12336/com.courtesy.test I/Process: Sending signal. PID: 12336 SIG: 9
当我在点击按钮之前没有点击 TextField
时它工作正常。
如果我使用 Column
而不是 LazyColumn
,一切都会正常工作。
有什么解决这个问题的想法吗?
已通过将撰写版本从 1.2.0-alpha06 更改为 1.2.0-alpha07
来修复