ارگ ایمن

روش پیشنهادی برای پیمایش بین مقاصد، استفاده از افزونه‌ی Safe Args Gradle است. این افزونه کلاس‌های شیء و سازنده‌ای تولید می‌کند که پیمایش ایمن از نوع داده (type-safe) را بین مقاصد فعال می‌کنند. از Safe Args برای پیمایش و انتقال داده‌ها بین مقاصد استفاده کنید.

فعال کردن آرگومان‌های امن

برای افزودن آرگومان‌های ایمن به پروژه خود، classpath زیر را در فایل build.gradle سطح بالای خود وارد کنید:

گرووی

buildscript {
    repositories {
        google()
    }
    dependencies {
        def nav_version = "2.9.8"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}

کاتلین

buildscript {
    repositories {
        google()
    }
    dependencies {
        val nav_version = "2.9.8"
        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version")
    }
}

همچنین باید یکی از دو افزونه موجود را اعمال کنید.

برای تولید کد زبان جاوا که برای ماژول‌های جاوا یا ترکیبی از جاوا و کاتلین مناسب باشد، این خط را به فایل build.gradle برنامه یا ماژول خود اضافه کنید:

گرووی

plugins {
  id 'androidx.navigation.safeargs'
}

کاتلین

plugins {
    id("androidx.navigation.safeargs")
}

روش دیگر، برای تولید کد کاتلین مناسب برای ماژول‌های فقط کاتلین، اضافه کردن:

گرووی

plugins {
  id 'androidx.navigation.safeargs.kotlin'
}

کاتلین

plugins {
    id("androidx.navigation.safeargs.kotlin")
}

شما باید طبق دستور Migrating to AndroidX، در فایل gradle.properties خود، android.useAndroidX=true را داشته باشید.

کد تولید شده

پس از فعال کردن Safe Args، کد تولید شده شما شامل کلاس‌ها و متدهایی برای هر عملی که تعریف کرده‌اید و همچنین کلاس‌هایی است که با هر مقصد ارسال و دریافت مطابقت دارند.

Safe Args برای هر مقصدی که یک اکشن از آن سرچشمه می‌گیرد، یک کلاس تولید می‌کند. نام کلاس تولید شده، "Directions" را به نام کلاس مقصد مبدا اضافه می‌کند. برای مثال، اگر مقصد مبدا SpecifyAmountFragment نام داشته باشد، کلاس تولید شده SpecifyAmountFragmentDirections نام خواهد داشت.

کلاس تولید شده شامل یک متد استاتیک برای هر اکشن تعریف شده در مقصد مبدا است. این متد هر پارامتر اکشن تعریف شده را به عنوان آرگومان دریافت می‌کند و یک شیء NavDirections را برمی‌گرداند که می‌توانید مستقیماً به navigate() ارسال کنید.

مثال آرگومان‌های امن

برای مثال، یک گراف ناوبری با یک اکشن واحد را در نظر بگیرید که دو مقصد، SpecifyAmountFragment و ConfirmationFragment را به هم متصل می‌کند. ConfirmationFragment یک پارامتر float واحد می‌گیرد که شما به عنوان بخشی از اکشن ارائه می‌دهید.

Safe Args یک کلاس SpecifyAmountFragmentDirections با یک متد واحد، actionSpecifyAmountFragmentToConfirmationFragment() ، و یک کلاس داخلی به نام ActionSpecifyAmountFragmentToConfirmationFragment تولید می‌کند. کلاس داخلی از NavDirections مشتق شده و شناسه اکشن و پارامتر float مرتبط را ذخیره می‌کند. سپس می‌توان شیء NavDirections برگردانده شده را مستقیماً به navigate() ارسال کرد، همانطور که در مثال زیر نشان داده شده است:

کاتلین

override fun onClick(v: View) {
    val amount: Float = ...
    val action =
        SpecifyAmountFragmentDirections
            .actionSpecifyAmountFragmentToConfirmationFragment(amount)
    v.findNavController().navigate(action)
}

جاوا

@Override
public void onClick(View view) {
    float amount = ...;
    action =
        SpecifyAmountFragmentDirections
            .actionSpecifyAmountFragmentToConfirmationFragment(amount);
    Navigation.findNavController(view).navigate(action);
}

برای اطلاعات بیشتر در مورد انتقال داده‌ها بین مقاصد با استفاده از آرگومان‌های ایمن، به استفاده از آرگومان‌های ایمن برای انتقال داده‌ها با نوع ایمنی مراجعه کنید.

با استفاده از آرگومان‌های ایمن، ایمنی نوع را تضمین کنید

با استفاده از افزونه‌ی Safe Args Gradle بین مقاصد حرکت کنید. این افزونه کلاس‌های شیء و سازنده‌ی ساده‌ای تولید می‌کند که امکان پیمایش ایمن از نوع داده و ارسال آرگومان بین مقاصد را فراهم می‌کند.

برای افزودن آرگومان‌های ایمن به پروژه خود، classpath زیر را در فایل build.gradle سطح بالای خود وارد کنید:

گرووی

buildscript {
    repositories {
        google()
    }
    dependencies {
        def nav_version = "2.9.8"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}

کاتلین

buildscript {
    repositories {
        google()
    }
    dependencies {
        val nav_version = "2.9.8"
        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version")
    }
}

همچنین باید یکی از دو افزونه موجود را اعمال کنید.

برای تولید کد زبان جاوا که برای ماژول‌های جاوا یا ترکیبی از جاوا و کاتلین مناسب باشد، این خط را به فایل build.gradle برنامه یا ماژول خود اضافه کنید:

گرووی

plugins {
  id 'androidx.navigation.safeargs'
}

کاتلین

plugins {
    id("androidx.navigation.safeargs")
}

روش دیگر، برای تولید کد کاتلین مناسب برای ماژول‌های فقط کاتلین، اضافه کردن:

گرووی

plugins {
  id 'androidx.navigation.safeargs.kotlin'
}

کاتلین

plugins {
    id("androidx.navigation.safeargs.kotlin")
}

شما باید طبق دستور Migrating to AndroidX، در فایل gradle.properties خود، android.useAndroidX=true را داشته باشید.

پس از فعال کردن Safe Args، افزونه کدی تولید می‌کند که شامل کلاس‌ها و متدهایی برای هر اکشنی است که تعریف کرده‌اید. Safe Args برای هر اکشن، یک کلاس برای هر مقصد مبدا نیز تولید می‌کند، که مقصدی است که اکشن از آن سرچشمه می‌گیرد. نام کلاس تولید شده ترکیبی از نام کلاس مقصد مبدا و کلمه "Directions" است. به عنوان مثال، اگر مقصد SpecifyAmountFragment نامگذاری شده باشد، کلاس تولید شده SpecifyAmountFragmentDirections نام دارد. کلاس تولید شده شامل یک متد استاتیک برای هر اکشن تعریف شده در مقصد مبدا است. این متد هر پارامتر اکشن تعریف شده را به عنوان آرگومان می‌گیرد و یک شیء NavDirections را برمی‌گرداند که می‌توانید به navigate() ارسال کنید.

به عنوان مثال، فرض کنید یک گراف ناوبری با یک اکشن واحد داریم که مقصد مبدا، SpecifyAmountFragment ، را به مقصد گیرنده، ConfirmationFragment ، متصل می‌کند.

Safe Args یک کلاس SpecifyAmountFragmentDirections با یک متد واحد به actionSpecifyAmountFragmentToConfirmationFragment() تولید می‌کند که یک شیء NavDirections را برمی‌گرداند. این شیء NavDirections برگردانده شده را می‌توان مستقیماً به navigate() ارسال کرد، همانطور که در مثال زیر نشان داده شده است:

کاتلین

override fun onClick(view: View) {
    val action =
        SpecifyAmountFragmentDirections
            .actionSpecifyAmountFragmentToConfirmationFragment()
    view.findNavController().navigate(action)
}

جاوا

@Override
public void onClick(View view) {
    NavDirections action =
        SpecifyAmountFragmentDirections
            .actionSpecifyAmountFragmentToConfirmationFragment();
    Navigation.findNavController(view).navigate(action);
}

برای اطلاعات بیشتر در مورد انتقال داده‌ها بین مقاصد با استفاده از آرگومان‌های ایمن، به بخش «استفاده از آرگومان‌های ایمن برای انتقال داده‌ها با نوع ایمنی» در بخش «انتقال داده‌ها بین مقاصد» مراجعه کنید.