Alex Styl
04/30/2024, 12:47 PMAlex Styl
04/30/2024, 12:47 PMvar isVisible by remember { mutableStateOf(false) }
val focusRequester = remember { FocusRequester() }
Row {
BasicText("Show", modifier = Modifier.clickable {
isVisible = true
focusRequester.requestFocus() // <- 💥 EXCEPTION: FocusRequester is not initialized
})
if(isVisible){
Box(Modifier.focusRequester(focusRequester).clickable { /* TODO */ })
}
}
Zach Klippenstein (he/him) [MOD]
04/30/2024, 12:50 PMwithNextFrameMillis
to wait until after the next frame is doneAlex Styl
04/30/2024, 12:52 PMAlex Styl
04/30/2024, 2:30 PMwithNextFrameMillis
but there is a withFrameMillis {}
. Trying to figure out how to use that nowAlex Styl
04/30/2024, 4:39 PM@Composable
fun frameTimeMillis(): State<Long> {
val millisState = remember { mutableStateOf(0L) }
LaunchedEffect(Unit) {
val startTime = withFrameMillis { it }
while (true) {
withFrameMillis { frameTime ->
millisState.value = frameTime - startTime
}
}
}
return millisState
}
Not perfect for my usecase as keeping val frameDelta by frameTimeMillis()
around seems to be causing compositions all the time (which makes sense).
got something to work with, so all is good. Thanks Zach 👍Zach Klippenstein (he/him) [MOD]
04/30/2024, 7:29 PMwithFrameMillis
. And yea, calling it will always request another frame.Zach Klippenstein (he/him) [MOD]
04/30/2024, 7:30 PMModifier.clickable {
isVisible = true
coroutineScope.launch {
withFrameMillis {}
focusRequester.requestFocus()
}
}
Alex Styl
04/30/2024, 8:11 PMAlex Styl
04/30/2024, 8:36 PMPopup
, but works great if it is just a Box
. Are Popups special somehow?
.
var isVisible by remember { mutableStateOf(false) }
val focusRequester = remember { FocusRequester() }
val scope = rememberCoroutineScope()
Row {
BasicText("Show", modifier = Modifier.clickable {
isVisible = true
scope.launch {
withFrameMillis { }
focusRequester.requestFocus() // <- 💥 CRASH
}
})
if (isVisible) {
Popup {
Box(Modifier.focusRequester(focusRequester).clickable { /* TODO */ }) {
BasicText("Hello")
}
}
}
}
Zach Klippenstein (he/him) [MOD]
04/30/2024, 8:42 PMFocusRequester
should queue requests made before it’s ready to handle things like this more ergonomically.Tobias Suchalla
05/02/2024, 5:29 AMfocusRequester
at the top level? Otherwise this works for me:
var isVisible by remember { mutableStateOf(false) }
Row {
BasicText("Show", modifier = Modifier.clickable {
isVisible = true
})
if (isVisible) {
Popup {
val focusRequester = remember { FocusRequester() }
LaunchedEffect(focusRequester) { focusRequester.requestFocus() }
Box(Modifier.focusRequester(focusRequester).clickable { /* TODO */ }) {
BasicText("Hello")
}
}
}
}
Ralston Da Silva
05/02/2024, 7:06 AMAlex Styl
05/02/2024, 7:31 AMAlex Styl
05/02/2024, 7:32 AMTobias Suchalla
05/02/2024, 8:21 AMvar isVisible by remember { mutableStateOf(false) }
var shouldFocus by remember { mutableStateOf(false) }
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
BasicText("Show", Modifier.clickable { isVisible = true })
BasicText("Hide", Modifier.clickable { isVisible = false })
BasicText("Focus", Modifier.clickable { shouldFocus = true })
BasicText("Show and focus", Modifier.clickable {
isVisible = true
shouldFocus = true
})
if (isVisible) {
Popup(offset = IntOffset(0, 40),) {
val focusRequester = remember { FocusRequester() }
val interactionSource = remember { MutableInteractionSource() }
val focused by interactionSource.collectIsFocusedAsState()
LaunchedEffect(shouldFocus) {
if (shouldFocus) focusRequester.requestFocus()
shouldFocus = false
}
Box(
modifier = Modifier
.focusRequester(focusRequester)
.focusable(interactionSource = interactionSource)
.clickable { /* TODO */ }
) {
BasicText(if (focused) "focused" else "not focused")
}
}
}
}
I only added the interactionSource
to show the focus state, it is not needed.Alex Styl
05/02/2024, 8:25 AM