Изучение

Выбор операции над стеком

Подберите push, замену, удаление, pop или операцию над ветвью по требуемому поведению Back.

v1.1.0Начальный уровень

Выбор операции над стеком

Сначала определите, куда должен вернуться Back. Ark Navigation не скрывает это решение за универсальным методом.

Нужный результатОперация
Добавить Detail над Listpush
Заменить Login на HomereplaceTop
Обновить параметры текущего EntryreconfigureTop
Задать полный стекreplaceAll или setStack
Открыть Receipt и убрать шаги CheckoutpushAndRemoveUntil
Заменить всё выше ShellreplaceTail
Вернуться на один экран с результатомpop
Вернуться к известному Route или EntrypopUntil
Удалить конкретный Entryremove
Переключить вкладку с сохранённым стеком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,
);