Изучение
Destination и Route
Типизированные параметры и результаты, связь со страницей и выбор между восстанавливаемым и локальным Route.
Destination и Route
Destination — публичный запрос приложения. Route Definition — Flutter-адаптер, который строит страницу и URI.
Параметры и результат в одном типе
final class EditProfileDestination extends NavigationDestination<Profile?> {
const EditProfileDestination({required this.userId});
final String userId;
}
Вызывающий код обязан передать userId и может получить Profile?. На странице нет приведения extra к ожидаемому типу.
Свяжите Destination со страницей
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-сессии, используйте:
restorationPolicy: NavigationRestorationPolicy.sessionOnly,
Такой Route не открывается по внешней ссылке и не восстанавливается после перезапуска.
Не смешивайте идентификаторы
NavigationRouteId— определениеproduct;ProductDestination('42')— конкретный запрос;NavigationEntryId— одно появление Product в живом стеке.
Два Product в стеке имеют общий Route ID и разные Entry ID. Для удаления конкретного экземпляра нужен Entry ID.
Когда нужно указать место явно
Если один Module смонтирован в нескольких местах, укажите mountId. Неоднозначный переход будет отклонён, а не разрешён по порядку регистрации.