Рецепты

Deep link и восстановление

Типизированные параметры URI, восстановление родительских страниц, поддержка старых URL и Route, существующие только в текущей Session.

v1.1.0Средний уровень

Deep link и восстановление

Преобразовать Product в /products/42

dart
uriCodec: CallbackNavigationUriCodec<ProductDestination>(
  pattern: '/products/:id',
  encoder: (value) => Uri(path: '/products/${value.productId}'),
  decoder: (match) => ProductDestination(match.path('id')),
),

Функциональный код передаёт ProductDestination и не разбирает URI самостоятельно.

Добавить родителей для прямой ссылки

dart
stackPlanBuilder: (product) => <NavigationTarget<Object?>>[
  const NavigationTarget<Object?>(destination: HomeDestination()),
  const NavigationTarget<Object?>(destination: CatalogDestination()),
  NavigationTarget<Object?>(destination: product),
],

Прямой результат: [Home, Catalog, Product].

Сохранить поддержку старого /item/42

Добавьте CallbackNavigationUriAlias с шаблоном /item/:id. Alias используется только при чтении ссылки, поэтому NavigationUriCodec продолжит создавать канонический URL /products/:id.

Не восстанавливать Route с объектом текущего процесса

Укажите restorationPolicy: NavigationRestorationPolicy.sessionOnly и не задавайте URI codec. Это подходит Route, который содержит controller или другой объект, который нельзя восстановить после перезапуска. Экран существует только в текущей Session.

Исправить URL без нового шага Back

Чтобы исправить URL без нового шага в истории браузера, используйте historyMode: NavigationHistoryMode.replace.