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을 사용합니다. 이 함수는 각각 자체 데코레이터 세트가 있는 여러 백 스택이 있는 경우에 유용합니다 (자세한 내용은 이 코드 레시피 참고). 이 함수는NavDisplay와 함께 사용할 수 있는 장식된NavEntry목록을 반환합니다.entryDecorators매개변수를 사용하여 데코레이터를NavDisplay에 직접 제공합니다.NavDisplay은 내부적으로rememberDecoratedNavEntries를 호출하고 장식된 항목을 표시합니다.
기본 데코레이터 포함
탐색 3에는 구성 변경과 프로세스 중단을 통해 NavEntry의 상태를 유지할 수 있는 SaveableStateHolderNavEntryDecorator라는 기본 데코레이터가 포함되어 있습니다. NavEntry 콘텐츠를 SaveableStateProvider로 래핑하여 NavEntry 콘텐츠 내에서 rememberSaveable 호출이 올바르게 작동하도록 합니다.
데코레이터가 SaveableStateProvider를 제공하지 않는 한 제공된 데코레이터 목록에 SaveableStateHolderNavEntryDecorator를 첫 번째 데코레이터로 포함해야 합니다. rememberSaveableStateHolderNavEntryDecorator을 사용하여 생성됩니다.
예를 들면 다음과 같습니다.
// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator NavDisplay( entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), remember { CustomNavEntryDecorator() } ), // ... )
데코레이터를 사용해야 하는 경우
데코레이터를 사용하여 다음 작업을 할 수 있습니다.
- 뒤로 스택의 모든
NavEntry에 종속 항목을 만듭니다. 예를 들어ViewModelStoreNavEntryDecorator은 모든NavEntry에 대해ViewModelStore를 만듭니다. - 객체를 여러
NavEntry에 범위 지정 예를 들어 여러 항목 간에ViewModel를 공유합니다. - 여러
NavEntry에 대해 동일한 작업을 실행합니다. 예를 들어 각 항목에 대해 로깅, 디버깅 또는 추적 작업을 실행합니다. - 동일한 컴포저블 함수로
NavEntry를 래핑합니다. NavEntry와 연결된 상태를 정리합니다. 예를 들어 항목이 백 스택에서 삭제되면ViewModelStoreNavEntryDecorator는 연결된ViewModelStore를 삭제합니다.
다음과 같은 용도로 데코레이터를 사용하지 마세요.
- 종속 항목을 단일
NavEntry에 전달합니다. - 범위가 백 스택보다 넓은 종속 항목을 제공합니다.
두 경우 모두 NavEntry를 만들 때 종속 항목을 직접 전달하세요.
더 많은 코드 예시는 NavEntryDecorator를 참고하세요.