Pablo
02/25/2025, 9:51 PMPablo
02/25/2025, 9:51 PM@Composable
fun DockedSearchBarScaffold() {
val textFieldState = rememberTextFieldState()
val searchBarState = rememberSearchBarState()
val scope = rememberCoroutineScope()
val scrollBehavior = SearchBarDefaults.enterAlwaysSearchBarScrollBehavior()
val inputField =
@Composable {
SearchBarDefaults.InputField(
modifier = Modifier,
searchBarState = searchBarState,
textFieldState = textFieldState,
onSearch = {
scope.launch {
searchBarState.animateToCollapsed()
}
},
placeholder = { Text("Search...") },
leadingIcon = {
if (searchBarState.currentValue == SearchBarValue.Expanded) {
IconButton(
onClick = { scope.launch { searchBarState.animateToCollapsed() } }
) {
Icon(Icons.AutoMirrored.Default.ArrowBack, contentDescription = "Back")
}
} else {
Icon(Icons.Default.Search, contentDescription = null)
}
}
)
}
TopSearchBar(
scrollBehavior = scrollBehavior,
state = searchBarState,
inputField = inputField,
)
ExpandedDockedSearchBar(
state = searchBarState,
inputField = inputField,
) {
SearchResults(
busStops = emptyList(),
onResultClick = { result ->
textFieldState.setTextAndPlaceCursorAtEnd(result)
scope.launch { searchBarState.animateToCollapsed() }
}
)
}
}
Zach Klippenstein (he/him) [MOD]
02/25/2025, 10:51 PMTextFieldState
has an answer to your question: https://developer.android.com/reference/kotlin/androidx/compose/foundation/text/input/TextFieldStatePablo
02/26/2025, 10:37 AMPablo
02/26/2025, 10:37 AMZach Klippenstein (he/him) [MOD]
02/26/2025, 10:57 AMTextFieldState
, as much as there is one. The value of the field is the text
property on the state. It’s like a mutableStateOf
. You use the same mechanisms to observe changes to it that you would for any compose state object.Zach Klippenstein (he/him) [MOD]
02/26/2025, 11:00 AMonValueChanged
, just do
LaunchedEffect(textFieldState) {
snapshotFlow { textFieldState.text }
.collect { onValueChanged(it) }
}