Что такое inclusive в контексте back stack в Android
Что проверяют
Понимаете ли вы, как устроен стек экранов, и умеете ли управлять им предсказуемо. Вопрос почти всегда про живой сценарий: после входа или после оформления заказа пользователь не должен возвращаться кнопкой назад на уже пройденный экран.
Как отвечать
inclusive это флаг снятия стека. Когда вы просите снять экраны до определённого пункта назначения, флаг отвечает на единственный вопрос: снимать ли сам этот пункт. Со значением false он остаётся на вершине, со значением true уходит вместе с тем, что было над ним.
В Navigation это выглядит так:
navController.navigate(R.id.home) {
popUpTo(R.id.login) { inclusive = true }
}Экран входа снят, кнопка назад с главного экрана уводит из приложения, а не обратно к форме. Тот же флаг есть у прямого снятия стека, а во фрагментном менеджере ему соответствует режим снятия с включением именованной точки.
Добавьте, что рядом с popUpTo живут сохранение и восстановление состояния. Для вкладок нижней навигации стек снимают с сохранением, иначе пользователь теряет позицию списка при каждом переключении вкладки.
Где спотыкаются
Описывают флаг как удаление текущего экрана. Текущий экран уходит и без него, речь всегда о том пункте назначения, до которого снимают стек. Из этой путаницы рождается лишний снятый экран и жалобы на то, что назад ведёт не туда.
Снимают стартовый пункт графа и получают пустой стек. Следующее нажатие назад закрывает приложение, хотя ожидался возврат на главный экран. Для выхода из ветки обычно достаточно снять до стартового пункта, не включая его самого.
Ставят флаг вместо другого механизма. Дубли экранов лечатся режимом единственной вершины, а состояние вкладок парой сохранения и восстановления. Сам по себе флаг ничего не сохраняет, и после снятия с включением восстанавливать уже нечего.