Можно ли перехватить кнопку «Назад», когда клавиатура открыта? С помощью EditText это возможно, как в ответе здесь, возможно ли это и для Compose?
У меня есть Search Composable, который вызывает поиск после 300 мс устранения дребезга, и когда я нажимаю кнопку "Назад", нажмите i хотите не только закрыть клавиатуру, но и снять фокус и очистить запрос.
Код: Выделить всё
val focusManager = LocalFocusManager.current
val keyboardController = LocalSoftwareKeyboardController.current
val dispatcher: OnBackPressedDispatcher =
LocalOnBackPressedDispatcherOwner.current!!.onBackPressedDispatcher
val backCallback = remember {
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (!state.focused) {
isEnabled = false
Toast.makeText(context, "Back", Toast.LENGTH_SHORT).show()
dispatcher.onBackPressed()
} else {
println("HomeScreen() Search Back ")
state.query = TextFieldValue("")
state.focused = false
focusManager.clearFocus()
keyboardController?.hide()
}
}
}
}
DisposableEffect(dispatcher) { // dispose/relaunch if dispatcher changes
dispatcher.addCallback(backCallback)
onDispose {
backCallback.remove() // avoid leaks!
}
}
< p>Обратите внимание: мне не нужно решение, предотвращающее выполнение другого запроса, добавление проверки предыдущего запроса делает это, я хочу перехватить обратное нажатие клавиатуры, поэтому только блок внутри handleOnBackPressed срабатывает при нажатии кнопки «Назад» при открытой клавиатуре, а не после ее закрытия.
[img]https://i.stack.imgur .com/YbV3A.gif[/img]
Код: Выделить всё
SearchState
Код: Выделить всё
class SearchState(
initialResults: List,
suggestions: List,
searchResults: List,
) {
var query by mutableStateOf(TextFieldValue())
var focused by mutableStateOf(false)
var initialResults by mutableStateOf(initialResults)
var suggestions by mutableStateOf(suggestions)
var searchResults by mutableStateOf(searchResults)
var searching by mutableStateOf(false)
var searchInProgress = searching
val searchDisplay: SearchDisplay
get() = when {
!focused && query.text.isEmpty() -> SearchDisplay.InitialResults
focused && query.text.isEmpty() -> SearchDisplay.Suggestions
searchInProgress -> SearchDisplay.SearchInProgress
!searchInProgress && searchResults.isEmpty() -> SearchDisplay.NoResults
else -> SearchDisplay.Results
}
}
Код: Выделить всё
LaunchedEffect(key1 = Unit) {
snapshotFlow { state.query }
.distinctUntilChanged()
.filter {
it.text.isNotEmpty()
}
.map {
state.searching = false
state.searchInProgress = true
it
}
.debounce(300)
.mapLatest {
state.searching = true
delay(300)
viewModel.getTutorials(it.text)
}
.collect {
state.searchInProgress = false
state.searching = false
state.searchResults = it
}
}
Источник: https://stackoverflow.com/questions/713 ... t-keyboard