Fatal Exception: java.lang.IllegalArgumentException offset(23) is out of bounds [0, 0] JetPack Compose OutlinedTextField

Viewed 552

Facing one crash in the jetpack compose, can anyone please help me with this.

Fatal Exception: java.lang.IllegalArgumentException: offset(23) is out of bounds [0, 0]
   at androidx.compose.ui.text.MultiParagraph.requireIndexInRangeInclusiveEnd(MultiParagraph.kt:593)
   at androidx.compose.ui.text.MultiParagraph.getBidiRunDirection(MultiParagraph.kt:406)
   at androidx.compose.ui.text.TextLayoutResult.getBidiRunDirection(TextLayoutResult.kt:353)
   at androidx.compose.foundation.text.CoreTextFieldKt.SelectionToolbarAndHandles(CoreTextField.kt:816)
   at androidx.compose.foundation.text.CoreTextFieldKt.access$SelectionToolbarAndHandles(CoreTextField.kt:1)
   at androidx.compose.foundation.text.CoreTextFieldKt$CoreTextField$4$1$1.invoke(CoreTextField.kt:565)
   at androidx.compose.foundation.text.CoreTextFieldKt$CoreTextField$4$1$1.invoke(CoreTextField.kt:527)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
   at androidx.compose.runtime.ComposablesKt.ReusableComposeNode(ComposablesKt.java:443)
   at androidx.compose.foundation.text.selection.SimpleLayoutKt.SimpleLayout(SimpleLayout.kt:79)
   at androidx.compose.foundation.text.CoreTextFieldKt$CoreTextField$4$1.invoke(CoreTextField.kt:527)
   at androidx.compose.foundation.text.CoreTextFieldKt$CoreTextField$4$1.invoke(CoreTextField.kt:510)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
   at androidx.compose.material.OutlinedTextFieldKt.IconsWithTextFieldLayout-T2E5_Oc(OutlinedTextField.kt:452)
   at androidx.compose.material.OutlinedTextFieldKt.access$OutlinedTextField$lambda-3(OutlinedTextField.kt:1)
   at androidx.compose.material.OutlinedTextFieldKt$OutlinedTextFieldLayout$1.invoke(OutlinedTextField.kt:350)
   at androidx.compose.material.OutlinedTextFieldKt$OutlinedTextFieldLayout$1.invoke(OutlinedTextField.kt:348)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
   at androidx.compose.foundation.text.CoreTextFieldKt.CoreTextField(CoreTextField.kt:510)
   at androidx.compose.foundation.text.BasicTextFieldKt.BasicTextField(BasicTextField.kt:262)
   at androidx.compose.material.OutlinedTextFieldKt.OutlinedTextFieldLayout-uBqXD2s(OutlinedTextField.kt:322)
   at androidx.compose.material.TextFieldImplKt$TextFieldImpl$3.invoke-h1eT-Ww(TextFieldImpl.kt:207)
   at androidx.compose.material.TextFieldImplKt$TextFieldImpl$3.invoke(TextFieldImpl.kt:129)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:214)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
   at androidx.compose.material.TextFieldTransitionScope.Transition-DTcfvLk(TextFieldImpl.kt:357)
   at androidx.compose.material.TextFieldImplKt.TextFieldImpl(TextFieldImpl.kt:119)
   at androidx.compose.material.OutlinedTextFieldKt.OutlinedTextField(OutlinedTextField.kt:270)
   at androidx.compose.material.OutlinedTextFieldKt.OutlinedTextField(OutlinedTextField.kt:157)
   at com.zee5.presentation.search.searchrefinement.composable.SearchRefinementScreenKt.TopTextInputView(SearchRefinementScreen.kt:131)
   at com.zee5.presentation.search.searchrefinement.composable.SearchRefinementScreenKt.SearchRefinementScreen(SearchRefinementScreen.kt:74)
   at com.zee5.presentation.search.searchrefinement.fragment.SearchRefinementFragment$onCreateView$1$1.invoke(SearchRefinementFragment.kt:60)
   at com.zee5.presentation.search.searchrefinement.fragment.SearchRefinementFragment$onCreateView$1$1.invoke(SearchRefinementFragment.kt:56)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
   at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:140)
   at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2158)
   at androidx.compose.runtime.ComposerImpl.skipCurrentGroup(Composer.kt:2404)
   at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2585)
   at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2571)
   at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:247)
   at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(SnapshotStateKt.java:1)
   at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:2571)
   at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt:2547)
   at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:620)
   at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:786)
   at androidx.compose.runtime.Recomposer.access$setCloseCause$p(Recomposer.kt:105)
   at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:456)
   at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:425)
   at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:34)
   at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109)
   at androidx.compose.ui.platform.AndroidUiDispatcher.access$setScheduledFrameDispatch$p(AndroidUiDispatcher.android.kt:41)
   at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:947)
   at android.view.Choreographer.doCallbacks(Choreographer.java:761)
   at android.view.Choreographer.doFrame(Choreographer.java:693)
   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
   at android.os.Handler.handleCallback(Handler.java:873)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:193)
   at android.app.ActivityThread.main(ActivityThread.java:6953)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:590)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2 Answers

We receive these crash logs regularly with Compose 1.1.1 and TextField using visual transformation. The problem was a dynamic change of visual transformation from VisualTransformation.None to our custom one after the user long pressed on input with some value inside it. And because we change that in onFocusEvent if FocusState.isFocused == true then race condition occurred somewhere in the TextField.

Our solution was to change visual transformation also on initial value change using value key inside remember statement

val ourCustomTransformation = remember {
    OurCustomTransformation()
}

var visualTransformation by remember(value) {
    mutableStateOf(
        if (value.isBlank()) {
            VisualTransformation.None
        } else {
            ourCustomTransformation
        }
    )
}
Related