Изучение
Выбор операции над стеком
Подберите push, замену, удаление, pop или операцию над ветвью по требуемому поведению Back.
v1.1.0Начальный уровень
Выбор операции над стеком
Сначала определите, куда должен вернуться Back. Ark Navigation не скрывает это решение за универсальным методом.
| Нужный результат | Операция |
|---|---|
| Добавить Detail над List | push |
| Заменить Login на Home | replaceTop |
| Обновить параметры текущего Entry | reconfigureTop |
| Задать полный стек | replaceAll или setStack |
| Открыть Receipt и убрать шаги Checkout | pushAndRemoveUntil |
| Заменить всё выше Shell | replaceTail |
| Вернуться на один экран с результатом | pop |
| Вернуться к известному Route или Entry | popUntil |
| Удалить конкретный Entry | remove |
| Переключить вкладку с сохранённым стеком | activateBranch |
| Очистить ветвь и потомков | resetBranch |
Результат страницы
dart
final ticket = navigation.push<Address?>(
const AddressPickerDestination(),
);
final commit = await ticket.committed;
switch (commit) {
case NavigationCommitted():
break;
case NavigationRejected(:final reason):
debugPrint('Переход отклонён: $reason');
return;
case NavigationFailed(:final error):
debugPrint('Ошибка навигации: $error');
return;
case NavigationNoChange(:final reason):
debugPrint('Стек не изменился: $reason');
return;
}
final completion = await ticket.completed;
if (completion case NavigationPopped<Address?>(:final result)) {
selectedAddress = result;
}
committed сообщает, был ли Entry добавлен, и объясняет отказ или ошибку. completed сообщает, как добавленный Entry покинул стек. Поэтому отказ Guard нельзя случайно принять за обычный результат null.
Сброс стека после входа
dart
await navigation.replaceAll(<NavigationTarget<Object?>>[
const NavigationTarget<Object?>(destination: HomeDestination()),
const NavigationTarget<Object?>(destination: AccountDestination()),
]);
Login больше нет в стеке, поэтому Back к нему не вернётся.
Вернитесь к известному Route
dart
await navigation.popUntil(
anchor: const NavigationRouteIdMatcher(NavigationRouteId('cart')),
);
Если один Route находится в стеке несколько раз, используйте NavigationEntryIdMatcher и ID нужного Entry.
Управляйте историей браузера отдельно
Каждая операция принимает historyMode. NavigationHistoryMode.push добавляет шаг для кнопки Back браузера, а replace исправляет текущий адрес без нового шага:
dart
navigation.replaceTop<void>(
const HomeDestination(),
historyMode: NavigationHistoryMode.replace,
);