Почему возникает 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