নেভিগেশন কোড মডিউলারাইজ করুন

এই পৃষ্ঠাটি আপনার নেভিগেশন কোড মডুলারাইজ করার জন্য একটি নির্দেশিকা। এটি অ্যাপ মডুলারাইজেশনের জন্য সাধারণ নির্দেশিকা পরিপূরক করার উদ্দেশ্যে তৈরি।

সংক্ষিপ্ত বিবরণ

আপনার নেভিগেশন কোড মডিউলারাইজ করা হল সম্পর্কিত নেভিগেশন কী এবং তারা যে বিষয়বস্তু উপস্থাপন করে তা পৃথক মডিউলে আলাদা করার প্রক্রিয়া। এটি দায়িত্বের একটি স্পষ্ট বিভাজন প্রদান করে এবং আপনাকে আপনার অ্যাপের বিভিন্ন বৈশিষ্ট্যের মধ্যে নেভিগেট করতে দেয়।

আপনার নেভিগেশন কোড মডুলারাইজ করতে, নিম্নলিখিতগুলি করুন:

  • আপনার অ্যাপের প্রতিটি বৈশিষ্ট্যের জন্য দুটি সাবমডিউল তৈরি করুন: api এবং impl
  • প্রতিটি বৈশিষ্ট্যের জন্য নেভিগেশন কীগুলি তার api মডিউলে রাখুন
  • সংশ্লিষ্ট impl মডিউলে প্রতিটি বৈশিষ্ট্যের জন্য entryProviders এবং নেভিগেবল কন্টেন্ট রাখুন
  • আপনার প্রধান অ্যাপ মডিউলগুলিতে সরাসরি অথবা নির্ভরতা ইনজেকশন ব্যবহার করে entryProviders প্রদান করুন

বৈশিষ্ট্যগুলিকে এপিআই এবং বাস্তবায়ন সাবমডিউলে আলাদা করুন

আপনার অ্যাপের প্রতিটি বৈশিষ্ট্যের জন্য, api এবং impl ("implementation" এর সংক্ষিপ্ত রূপ) নামে দুটি সাবমডিউল তৈরি করুন। নেভিগেশন কোড কোথায় রাখবেন তা নির্ধারণ করতে নিম্নলিখিত টেবিলটি ব্যবহার করুন।

মডিউলের নাম

ধারণ করে

api

নেভিগেশন কী

impl

NavEntry এবং entryProvider এর সংজ্ঞা সহ সেই বৈশিষ্ট্যের জন্য সামগ্রী। আরও দেখুন resolve keys to content

এই পদ্ধতির মাধ্যমে একটি বৈশিষ্ট্যকে অন্যটিতে নেভিগেট করার সুযোগ দেওয়া হয়, এর impl মডিউলে থাকা কন্টেন্টগুলিকে, সেই মডিউলের api মডিউলে থাকা অন্য মডিউলের নেভিগেশন কীগুলির উপর নির্ভর করতে দেওয়া হয়।

ফিচার মডিউল নির্ভরতা চিত্রটি দেখায় যে কীভাবে `impl` মডিউলগুলি `api` মডিউলের উপর নির্ভর করতে পারে।
চিত্র ১. বৈশিষ্ট্য মডিউল নির্ভরতা চিত্রটি দেখায় যে কীভাবে বাস্তবায়ন মডিউলগুলি এপিআই মডিউলের উপর নির্ভর করতে পারে।

এক্সটেনশন ফাংশন ব্যবহার করে নেভিগেশন এন্ট্রি আলাদা করুন

নেভিগেশন ৩-এ, নেভিগেবল কন্টেন্টকে নেভিগেশন এন্ট্রি ব্যবহার করে সংজ্ঞায়িত করা হয়। এই এন্ট্রিগুলিকে আলাদা মডিউলে আলাদা করতে, 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 ব্যবহার করে কল করা হয়। যদি আপনার অ্যাপে অনেক স্ক্রিন বা ফিচার মডিউল থাকে, তাহলে এটি ভালোভাবে স্কেল নাও হতে পারে।

এটি সমাধানের জন্য, প্রতিটি বৈশিষ্ট্য মডিউলকে নির্ভরতা ইনজেকশন ব্যবহার করে অ্যাপের কার্যকলাপে তার এন্ট্রি বিল্ডারদের অবদান রাখতে বলুন।

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি ড্যাগার মাল্টিবাইন্ডিং ব্যবহার করে, বিশেষ করে @IntoSet , যা MainActivity এর মালিকানাধীন একটি Set এন্ট্রি বিল্ডারগুলিকে ইনজেক্ট করে। এরপর এগুলিকে পুনরাবৃত্তভাবে 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 উপাদান থাকে যা নতুন স্ক্রিনে নেভিগেট করে—প্রতিটি বিল্ডার ফাংশনে অ্যাপের নেভিগেশন অবস্থা পরিবর্তন করতে সক্ষম এমন একটি বস্তু ইনজেক্ট করে।

রিসোর্স

নেভিগেশন ৩ কোড কীভাবে মডুলারাইজ করতে হয় তা দেখানো কোড নমুনার জন্য, দেখুন: