Функция BackHandler
Функция BackHandler из пакета activity-compose
перехватывает нажатие системной кнопки «назад»,
пока composable на экране. Включение задают
в enabled, реакцию - в лямбде
onBack. Это не класс
OnBackPressedDispatcher из activity,
а отдельная composable-функция для Compose.
Синтаксис
BackHandler(enabled = true) {
onBackAction()
}
Параметры
| Параметр | Описание |
|---|---|
enabled |
Если true, перехват активен.
Если false, нажатие уходит
следующему обработчику в стопке.
|
onBack |
Лямбда без аргументов. Вызывается, когда пользователь нажал «назад» и перехват включён. |
Пример
Давайте закроем верхний экран через popBackStack:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.BackHandler
import androidx.activity.compose.setContent
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = "home",
) {
composable("home") {
Button(onClick = { navController.navigate("details") }) {
Text(text = "abcde")
}
}
composable("details") {
BackHandler {
navController.popBackStack()
}
Text(text = "12345")
}
}
}
}
}
На экране "details" кнопка «назад»
вернёт на "home" с кнопкой "abcde".
Пример
Давайте временно отключим перехват:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.BackHandler
import androidx.activity.compose.setContent
import androidx.compose.material3.Text
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = "home",
) {
composable("home") {
Text(text = "abcde")
}
composable("details") {
BackHandler(enabled = false) {
navController.popBackStack()
}
Text(text = "12345")
}
}
}
}
}
На экране "details" «назад» обработает
NavHost сам, без вызова лямбды в BackHandler.
Смотрите также
-
метод
popBackStack,
которым снимают верхний экран со стопки -
метод
navigateUp,
который идёт назад по иерархии графа -
функция
NavHost,
который сам обрабатывает «назад» между маршрутами -
метод
navigate,
которым открывают следующий экран