Изучение

Destination и Route

Типизированные параметры и результаты, связь со страницей и выбор между восстанавливаемым и локальным Route.

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

Destination и Route

Destination — публичный запрос приложения. Route Definition — Flutter-адаптер, который строит страницу и URI.

Параметры и результат в одном типе

dart
final class EditProfileDestination extends NavigationDestination<Profile?> {
  const EditProfileDestination({required this.userId});
  final String userId;
}

Вызывающий код обязан передать userId и может получить Profile?. На странице нет приведения extra к ожидаемому типу.

Свяжите Destination со страницей

dart
final editProfileRoute =
    NavigationRouteDefinition<EditProfileDestination, Profile?>(
  id: const NavigationRouteId('edit-profile'),
  pageBuilder: (context, destination, entry) => EditProfilePage(
    userId: destination.userId,
  ),
  uriCodec: CallbackNavigationUriCodec<EditProfileDestination>(
    pattern: '/users/:userId/edit',
    encoder: (destination) => Uri(path: '/users/${destination.userId}/edit'),
    decoder: (match) => EditProfileDestination(
      userId: match.path('userId'),
    ),
  ),
);

Передавайте устойчивые идентификаторы, а актуальные данные загружайте через прикладной слой.

Восстанавливаемый Route и Route текущей Session

По умолчанию Route участвует в восстановлении и обязан иметь URI codec. Если Destination содержит объект, существующий только в текущей runtime-сессии, используйте:

dart
restorationPolicy: NavigationRestorationPolicy.sessionOnly,

Такой Route не открывается по внешней ссылке и не восстанавливается после перезапуска.

Не смешивайте идентификаторы

  • NavigationRouteId — определение product;
  • ProductDestination('42') — конкретный запрос;
  • NavigationEntryId — одно появление Product в живом стеке.

Два Product в стеке имеют общий Route ID и разные Entry ID. Для удаления конкретного экземпляра нужен Entry ID.

Когда нужно указать место явно

Если один Module смонтирован в нескольких местах, укажите mountId. Неоднозначный переход будет отклонён, а не разрешён по порядку регистрации.