탐색 코드 모듈화

이 페이지는 탐색 코드를 모듈화하기 위한 가이드입니다. 앱 모듈화에 관한 일반적인 안내를 보완하기 위한 것입니다.

개요

탐색 코드 모듈화는 관련 탐색 키와 이러한 키가 나타내는 콘텐츠를 개별 모듈로 분리하는 프로세스입니다. 이렇게 하면 책임을 명확하게 분리하고 앱의 여러 기능 간에 이동할 수 있습니다.

탐색 코드를 모듈화하려면 다음 단계를 따르세요.

  • 앱의 각 기능에 대해 apiimpl 하위 모듈을 두 개 만듭니다.
  • 각 기능의 탐색 키를 api 모듈에 배치합니다.
  • 각 기능의 entryProviders 및 탐색 가능한 콘텐츠를 연결된 impl 모듈에 배치합니다.
  • 직접 또는 종속 항목 주입을 사용하여 기본 앱 모듈에 entryProviders를 제공합니다.

기능을 API 및 구현 하위 모듈로 분리

앱의 각 기능에 대해 apiimpl(구현의 약어)라는 하위 모듈을 두 개 만듭니다. 다음 표를 사용하여 탐색 코드를 배치할 위치를 결정합니다.

모듈 이름

포함

api

탐색 키

impl

해당 기능의 콘텐츠(정의 포함): NavEntryentryProvider 콘텐츠로 키 확인도 참고하세요. .

이 접근 방식을 사용하면 impl 모듈에 포함된 콘텐츠가 해당 모듈의 api 모듈에 포함된 다른 모듈의 탐색 키에 종속되도록 허용하여 한 기능에서 다른 기능으로 이동할 수 있습니다.

`impl` 모듈이 `api` 모듈에 종속될 수 있는 방법을 보여주는 기능 모듈 종속 항목 다이어그램
그림 1. 구현 모듈이 API 모듈에 종속될 수 있는 방법을 보여주는 기능 모듈 종속 항목 다이어그램

확장 함수를 사용하여 탐색 항목 분리

탐색 3에서 탐색 가능한 콘텐츠는 탐색 항목을 사용하여 정의됩니다. 이러한 항목을 별도의 모듈로 분리하려면 EntryProviderScope에 확장 함수를 만들고 해당 기능의 impl 모듈로 이동합니다. 이를 항목 빌더 라고 합니다.

다음 코드 예는 탐색 항목 두 개를 빌드하는 항목 빌더를 보여줍니다.

// import androidx.navigation3.runtime.EntryProviderScope
// import androidx.navigation3.runtime.NavKey

fun EntryProviderScope<NavKey>.featureAEntryBuilder() {
    entry<KeyA> {
        ContentRed("Screen A") {
            // Content for screen A
        }
    }
    entry<KeyA2> {
        ContentGreen("Screen A2") {
            // Content for screen A2
        }
    }
}

기본 앱 모듈에서 entryProvider를 정의할 때 entryProvider DSL을 사용하여 해당 함수를 호출합니다.

// import androidx.navigation3.runtime.entryProvider
// import androidx.navigation3.ui.NavDisplay
NavDisplay(
    entryProvider = entryProvider {
        featureAEntryBuilder()
    },
    // ...
)

종속 항목 주입을 사용하여 기본 앱에 항목 추가

이전 코드 예에서 각 항목 빌더는 entryProvider DSL을 사용하여 기본 앱에서 직접 호출됩니다. 앱에 화면 또는 기능 모듈이 많은 경우 이 패턴은 확장되지 않을 수 있습니다.

이 문제를 해결하려면 각 기능 모듈이 종속 항목 주입을 사용하여 항목 빌더를 앱의 활동에 제공하도록 합니다.

예를 들어 다음 코드는 Dagger 멀티바인딩, 특히 @IntoSet, 항목 빌더를 Set가 소유한 MainActivity에 삽입합니다. 그러면 entryProvider 내에서 반복적으로 호출되어 여러 항목 빌더 함수를 명시적으로 호출할 필요가 없습니다.

기능 모듈

// import dagger.Module
// import dagger.Provides
// import dagger.hilt.InstallIn
// import dagger.hilt.android.components.ActivityRetainedComponent
// import dagger.multibindings.IntoSet

@Module
@InstallIn(ActivityRetainedComponent::class)
object FeatureAModule {

    @IntoSet
    @Provides
    fun provideFeatureAEntryBuilder() : EntryProviderScope<NavKey>.() -> Unit = {
        featureAEntryBuilder()
    }
}

앱 모듈

// import android.os.Bundle
// import androidx.activity.ComponentActivity
// import androidx.activity.compose.setContent
// import androidx.navigation3.runtime.EntryProviderScope
// import androidx.navigation3.runtime.NavKey
// import androidx.navigation3.runtime.entryProvider
// import androidx.navigation3.ui.NavDisplay
// import javax.inject.Inject

class MainActivity : ComponentActivity() {

    @Inject
    lateinit var entryBuilders: Set<@JvmSuppressWildcards EntryProviderScope<NavKey>.() -> Unit>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            NavDisplay(
                entryProvider = entryProvider {
                    entryBuilders.forEach { builder -> this.builder() }
                },
                // ...
            )
        }
    }
}

탐색 항목이 이동해야 하는 경우(예: 새 화면으로 이동하는 UI 요소 포함) 앱의 탐색 상태를 수정할 수 있는 객체를 각 빌더 함수에 삽입합니다.

앱이 딥 링크를 지원하고 모듈화된 경우 각 기능 모듈 은 소유한 대상의 DeepLinkMatcher 인스턴스를 정의해야 합니다.

앱 전체의 모든 일치기를 수집하려면 종속 항목 주입 멀티바인딩을 사용하면 됩니다. 예를 들어 각 기능 모듈은 일치기를 Dagger @IntoSet 멀티바인딩에 제공할 수 있습니다.

기능 모듈

그런 다음 MainActivity와 같은 기본 앱 모듈에서 일치기 집합을 삽입하고 이를 사용하여 수신 요청을 일치시킬 수 있습니다.

앱 모듈

딥 링크 정의 및 처리에 관한 자세한 내용은 딥 링크 지원을 참고하세요.

리소스

탐색 3 코드를 모듈화하는 방법을 보여주는 코드 샘플은 다음을 참고하세요.