Вы можете добавить дополнительную информацию или применить ту же логику к пунктам назначения, используя класс NavEntryDecorator . Этот класс оборачивает каждый NavEntry в стек возврата с компонуемой функцией. Другими словами, он декорирует содержимое записи.
Создайте собственный декоратор
Для создания декоратора расширьте класс NavEntryDecorator и переопределите следующие методы:
-
decorate— это компонуемая лямбда-функция, которая вызывается для каждогоNavEntryв вашем стеке возврата. Она принимаетNavEntryв качестве параметра. Это позволяет создавать объекты состояния, которые привязаны кcontentKeyзаписи. Вы можете использоватьCompositionLocalProviderдля предоставления зависимостей от содержимого записи. Вы также можете окружить содержимое компонуемой функцией или запускать побочные эффекты. Внутри этого метода всегда следует вызыватьentry.Content(). -
onPop— это функция обратного вызова, которая вызывается, когда элементNavEntryудаляется из стека возврата и покидает композицию. Она получаетcontentKeyудаленного элемента. ИспользуйтеcontentKeyдля идентификации и очистки любого состояния, связанного с этим элементом.
В следующем примере класс NavEntryDecorator расширяется для создания пользовательского декоратора.
// import androidx.navigation3.runtime.NavEntryDecorator class CustomNavEntryDecorator<T : Any> : NavEntryDecorator<T>( decorate = { entry -> Log.d("CustomNavEntryDecorator", "entry with ${entry.contentKey} entered composition and was decorated") entry.Content() }, onPop = { contentKey -> Log.d("CustomNavEntryDecorator", "entry with $contentKey was popped") } )
Если вашему декоратору необходим доступ к состоянию, создайте компонуемую функцию, которая создает это состояние, а затем используйте её для построения декоратора. Пример реализации можно найти в исходном коде rememberSaveableStateHolderNavEntryDecorator . Эта функция создает состояние — SaveableStateHolder — и использует его для построения декоратора.
Украсьте заднюю стопку
После создания NavEntryDecorator , декорируйте элементы в стеке возврата одним из двух способов:
- Используйте
rememberDecoratedNavEntries. Эта функция полезна, когда у вас есть несколько стеков возврата, каждый со своим набором декораторов (подробнее см. в этом примере кода ). Функция возвращает декорированный списокNavEntry, который можно использовать сNavDisplay. - Передайте свой декоратор непосредственно в
NavDisplay, используя параметрentryDecorators.NavDisplayвызываетrememberDecoratedNavEntriesи отображает декорированные записи.
Включить декоратор по умолчанию
В Navigation 3 используется декоратор по умолчанию под названием SaveableStateHolderNavEntryDecorator , который позволяет сохранять состояние NavEntry при изменении конфигурации и завершении процесса. Он оборачивает содержимое NavEntry в SaveableStateProvider , что обеспечивает корректную работу вызовов rememberSaveable внутри содержимого NavEntry .
Если ваш декоратор не предоставляет SaveableStateProvider , вам следует включить SaveableStateHolderNavEntryDecorator в качестве первого декоратора в списке предоставляемых декораторов. Он создается с помощью rememberSaveableStateHolderNavEntryDecorator .
Например:
// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator NavDisplay( entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), remember { CustomNavEntryDecorator() } ), // ... )
Когда следует обратиться к декоратору?
Используйте декоратор для:
- Создайте зависимость для каждого
NavEntryв стеке возврата. Например,ViewModelStoreNavEntryDecoratorсоздаетViewModelStoreдля каждогоNavEntry. - Присвойте объекту область действия нескольких элементов
NavEntry. Например, чтобы использовать одну и ту жеViewModelдля нескольких элементов NavEntry. - Выполните одно и то же действие для нескольких элементов
NavEntry. Например, для выполнения операций логирования, отладки или трассировки для каждого элемента. - Оберните элементы
NavEntryв ту же самую составную функцию. - Очистка состояния, связанного с элементами
NavEntry. Например, когда элемент удаляется из стека "Назад",ViewModelStoreNavEntryDecoratorочищает связанный с нимViewModelStore.
Не используйте дизайнера интерьеров для:
- Передайте зависимость отдельному элементу
NavEntry. - Укажите зависимости, область действия которых шире, чем стек вызовов.
В обоих этих случаях передавайте зависимость напрямую при создании элемента NavEntry .
Дополнительные примеры кода см. в разделе NavEntryDecorator .