Colton Idle
04/21/2025, 5:27 PMfun Modifier.onFocusLost(onFocusLost: ()-> Unit) = composed {
var isFocused: Boolean by remember { mutableStateOf(false) }
Modifier.onFocusChanged {
if(isFocused == true && it.isFocused == false){
isFocused = it.isFocused
onFocusLost()
} else {
isFocused = it.isFocused
}
}
}
Hayk
04/21/2025, 6:05 PMcomposed
to create custom modifiers is no longer recommended; instead, they go with nodes. https://developer.android.com/develop/ui/compose/custom-modifiers#implement-customPHondogo
04/21/2025, 6:54 PMfun Modifier.onFocusLost(
listener: () -> Unit
): Modifier {
return this then FocusLostListenerModifierNodeElement(listener)
}
class FocusLostListenerNode(
internal var listener: () -> Unit
) : Modifier.Node(), FocusEventModifierNode {
private var hasFocus: Boolean = false
override fun onFocusEvent(focusState: FocusState) {
if (focusState.hasFocus) {
hasFocus = true
} else if (hasFocus) {
hasFocus = false
listener()
}
}
}
data class FocusLostListenerModifierNodeElement(
val listener: () -> Unit
) : ModifierNodeElement<FocusLostListenerNode>() {
override fun create() = FocusLostListenerNode(listener)
override fun update(node: FocusLostListenerNode) {
node.listener = listener
}
}
Colton Idle
04/22/2025, 1:27 AMFlowFan
04/22/2025, 1:34 AM@Composable
Modifier?
@Composable
fun Modifier.onFocusLost(onFocusLost: () -> Unit): Modifier {
var isFocused: Boolean by remember { mutableStateOf(false) }
return this then Modifier.onFocusChanged {
if (isFocused == true && it.isFocused == false) {
isFocused = it.isFocused
onFocusLost()
} else {
isFocused = it.isFocused
}
}
}
PHondogo
04/22/2025, 4:43 AMInteresting how much more complex that modifier becomes with nodes...
But this is more performant solution.Alex Styl
04/22/2025, 9:14 PMonMovedAway
callback, having a similar logic as the one u shared. very handy for knowing when the text field is no longer in focusedColton Idle
04/23/2025, 7:50 PMFlowFan
04/24/2025, 1:59 AMcomposed
.