After upgrading compose to alpha12, I'm getting an...
# compose
s
After upgrading compose to alpha12, I'm getting an exception
java.lang.IllegalArgumentException: Anchor refers to a group that was removed
when interacting with a TextField inside of the dialog. Specifically when TextField is focused Stack trace and the sample in the thread 🧵
Copy code
Column(
    horizontalAlignment = Alignment.CenterHorizontally,
    verticalArrangement = Arrangement.Center,
) {
    var isDialogShowing by remember { mutableStateOf(false) }

    Button(onClick = { isDialogShowing = true }) {
        Text("Show Dialog")
    }

    if (isDialogShowing) {
        Dialog(onDismissRequest = { isDialogShowing = false }) {
            var text by remember { mutableStateOf("") }
            Card(Modifier.padding(16.dp)) {
                Column(
                    verticalArrangement = Arrangement.spacedBy(16.dp),
                ) {
                    OutlinedTextField(value = text, onValueChange = { text = it })

                    Button(onClick = { isDialogShowing = false }) {
                        Text(text = "Done")
                    }
                }

            }
        }
    }
}
java.lang.IllegalArgumentException: Anchor refers to a group that was removed
at androidx.compose.runtime.SlotTable.anchorIndex(SlotTable.kt:199)
at androidx.compose.runtime.Anchor.toIndexFor(SlotTable.kt:466)
at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.getCompositionLocalScope$runtime_release(Composer.kt:3124)
at androidx.compose.runtime.ComposerImpl.startRoot(Composer.kt:1140)
at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt:2697)
at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:306)
at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:533)
at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:95)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$4.invoke(Recomposer.kt:423)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$4.invoke(Recomposer.kt:397)
at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.kt:34)
at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.kt:112)
at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.kt:43)
at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.kt:72)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1008)
at android.view.Choreographer.doCallbacks(Choreographer.java:809)
at android.view.Choreographer.doFrame(Choreographer.java:740)
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:8419)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:596)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
s
Yep same here
j
Same here... when closing a Dialog with Textfield, i get this exception.
a
Can you show some code? Asking because same problem in Compose fo Desktop. https://github.com/JetBrains/compose-jb/issues?q=is%3Aissue+is%3Aopen+anchor
At the moment I'm using my custom fake popups via
Card
s
Welp, turns out it's only a workaround for our specific case, and the dialog still crashes when TextField is focused 🙃 But here's the idea:
Copy code
Column(
  modifier = Modifier.fillMaxSize(),
  horizontalAlignment = Alignment.CenterHorizontally,
  verticalArrangement = Arrangement.Center,
) {
  var isDialogShowing by remember { mutableStateOf(false) }
  
  var isInputEnabled by remember { mutableStateOf(true) }
  val keyboardController: Ref<SoftwareKeyboardController?> by remember { mutableStateOf(Ref()) }
  
  fun clearTextFieldFocus() {
    keyboardController.value?.hideSoftwareKeyboard()
    isInputEnabled = false
  }
  
  Button(onClick = { isDialogShowing = true }) {
    Text("Show Dialog")
  }
  
  if (isDialogShowing) {
    Dialog(
      properties = DialogProperties(
        dismissOnBackPress = false,
      ),
      onDismissRequest = {
        clearTextFieldFocus()
        isDialogShowing = false
      },
    ) {
      Card(Modifier.padding(16.dp)) {
        var text by remember { mutableStateOf("") }
  
        LaunchedEffect(Unit) {
          isInputEnabled = true
        }
  
        Column(
          verticalArrangement = Arrangement.spacedBy(16.dp),
        ) {
          OutlinedTextField(
            value = text,
            onValueChange = { text = it },
            enabled = isInputEnabled,
            onTextInputStarted = {
              keyboardController.value = it
            },
            keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
            keyboardActions = KeyboardActions(
              onDone = { clearTextFieldFocus() }
            ),
          )
  
          Button(
            onClick = {
              clearTextFieldFocus()
              isDialogShowing = false
            }
          ) {
            Text(text = "Done")
          }
        }
      }
    }
  }
}
🙌 1
So we'll have wait and hope that it gets fixed by Google🤞🏼