Почему возникает CompletionHandlerException?

Есть Column в котором список кнопок, нужно попросить фокус на первую в списке, делаю это вот так

...
               var modifier: Modifier = Modifier
                   .height(96.toDpWithOffset)
                   .width(520.toDpWithOffset)


               if (idx == 0) {
                   modifier = modifier.focusRequester(focusRequester)
               }

               Button(modifier = modifier...
...

То есть если это первая кнопка добавь focusRequester в modifier

Вопрос вот в чем, визуально это можно было бы сократить вот так

...
                Button(
                    modifier = Modifier
                        .height(96.toDpWithOffset)
                        .width(520.toDpWithOffset)
                        .apply {
                            if (idx == 0) {
                                this.focusRequester(focusRequester)
                            }
                        }
...

но почему то выкидывает ошибку

Process: ca.bellmedia.cravetv.debug, PID: 27984
                 kotlinx.coroutines.CompletionHandlerException: Exception in completion handler InvokeOnCompletion@b5280d2[job@9cd05a3] for StandaloneCoroutine{Completed}@9cd05a3
                    at kotlinx.coroutines.JobSupport.completeStateFinalization(JobSupport.kt:322)
                    at kotlinx.coroutines.JobSupport.tryFinalizeSimpleState(JobSupport.kt:297)
                    at kotlinx.coroutines.JobSupport.tryMakeCompleting(JobSupport.kt:860)
                    at kotlinx.coroutines.JobSupport.makeCompletingOnce$kotlinx_coroutines_core(JobSupport.kt:832)
                    at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:100)
                    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
                    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
                    at androidx.compose.ui.platform.AndroidUiDispatcher.performTrampolineDispatch(AndroidUiDispatcher.android.kt:81)
                    at androidx.compose.ui.platform.AndroidUiDispatcher.access$performTrampolineDispatch(AndroidUiDispatcher.android.kt:41)
                    at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.run(AndroidUiDispatcher.android.kt:57)
                    at android.os.Handler.handleCallback(Handler.java:958)
                    at android.os.Handler.dispatchMessage(Handler.java:99)
                    at android.os.Looper.loopOnce(Looper.java:205)
                    at android.os.Looper.loop(Looper.java:294)
                    at android.app.ActivityThread.main(ActivityThread.java:8177)
                    at java.lang.reflect.Method.invoke(Native Method)
                    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
                    Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.ui.platform.MotionDurationScaleImpl@99dc6cc, androidx.compose.runtime.BroadcastFrameClock@887fd15, StandaloneCoroutine{Completed}@9cd05a3, AndroidUiDispatcher@441582a]
                 Caused by: java.lang.IllegalStateException: 
                    FocusRequester is not initialized. Here are some possible fixes:
                 
                    1. Remember the FocusRequester: val focusRequester = remember { FocusRequester() }
                    2. Did you forget to add a Modifier.focusRequester() ?
                    3. Are you attempting to request focus during composition? Focus requests should be made in
                    response to some event. Eg Modifier.clickable { focusRequester.requestFocus() }

что упускаю тут?


Ответы (1 шт):

Автор решения: Wlad

попытался воспроизвести ваш код следующим образом

@Composable
fun Test(
    rnd: Int
) {
    val focusRequest = remember { FocusRequester() }
    LaunchedEffect(rnd) {
        focusRequest.requestFocus()
    }
    Column {
        (0..3).forEach {i->
            TextField(
                modifier = Modifier
                    .let {
                        if (rnd == i) {
                            it.focusRequester(focusRequest)
                        } else it
                    },
                value = "${i}",
                onValueChange = {}
            )
        }
    }
}

он работает. но если заменить let на apply то падает с такой же ошибкой как у вас.
в ошибке, кстати, об этом и говорится
2. Did you forget to add a Modifier.focusRequester() ?

причины: все методы Modifier'а возвращают новый объект, а не добавляют что-то к уже существующему. используйте let или любой другой метод, который вернет вам новый Modifier

→ Ссылка