اعمال منطق یا بسته‌بندی به مقصدها

می‌توانید اطلاعات بیشتری ارائه دهید یا منطق یکسانی را بااستفاده از کلاس 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 استفاده کنید.
  • بااستفاده از پارامتر entryDecorators، دکوراتور خود را مستقیماً به NavDisplay ارائه دهید. NavDisplay rememberDecoratedNavEntries را در پشت صحنه فراخوانی می‌کند و ورودی‌های تزئین‌شده را نمایش می‌دهد.

گنجاندن تزئین‌کننده پیش‌فرض

Navigation 3 شامل یک دکوراتور پیش‌فرض به‌نام SaveableStateHolderNavEntryDecorator است که امکان حفظ وضعیت NavEntry را ازطریق تغییرات پیکربندی و مرگ پردازش فراهم می‌کند. این روش محتوای NavEntry را با SaveableStateProvider می‌پوشاند، که باعث می‌شود تماس‌های rememberSaveable درون محتوای NavEntry به‌درستی عمل کنند.

مگر اینکه تزئین‌کننده شما SaveableStateProvider را ارائه دهد، باید SaveableStateHolderNavEntryDecorator را به‌عنوان اولین تزئین‌کننده در فهرست تزئین‌کننده‌های ارائه‌شده اضافه کنید. بااستفاده از rememberSaveableStateHolderNavEntryDecorator ایجاد شده است.

برای مثال:

// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
NavDisplay(
    entryDecorators = listOf(
        rememberSaveableStateHolderNavEntryDecorator(),
        remember { CustomNavEntryDecorator() }
    ),
    // ...
)

نتایج را بااستفاده از ResultEventBusNavEntryDecorator ارسال کنید

از Navigation 3 1.2.0، می‌توانید از ResultEventBusNavEntryDecorator برای ارائه ResultEventBus به هر NavEntry بااستفاده از LocalResultEventBus composition local استفاده کنید.

به‌طور پیش‌فرض، rememberResultEventBusNavEntryDecorator نمونه ResultEventBus خودش را به‌طور داخلی بااستفاده از rememberResultEventBus ایجاد می‌کند و به‌خاطر می‌سپارد. If you need to access the event bus outside of the decorator hierarchy (such as at the top-level app scaffolding), you can hoist the ResultEventBus by calling rememberResultEventBus and passing it to rememberResultEventBusNavEntryDecorator(resultEventBus):

val resultEventBus = rememberResultEventBus()

NavDisplay(
    /* ... */
    entryDecorators = listOf(
        rememberSaveableStateHolderNavEntryDecorator(),
        rememberResultEventBusNavEntryDecorator(resultEventBus = resultEventBus)
    )
)

برای جزئیات بیشتر درباره ارسال و مشاهده نتایج، برگرداندن نتایج را ببینید.

چه زمانی از دکوراتور استفاده کنیم

از دکوراتور برای موارد زیر استفاده کنید:

  • برای هر NavEntry در پشته قبلی‌ها، وابستگی ایجاد کنید. برای مثال، ViewModelStoreNavEntryDecorator برای هر NavEntry یک ViewModelStore ایجاد می‌کند.
  • نتایج را منتقل کنید و بین مقصدها ارتباط برقرار کنید. برای مثال، ResultEventBusNavEntryDecorator ResultEventBus را برای مقصدهای موجود در پشته قبلی‌ها ارائه می‌دهد.
  • دامنه شیء را به چند NavEntry محدود کنید. برای مثال، برای هم‌رسانی ViewModel بین چند ورودی.
  • انجام دادن کنش یکسان برای چند NavEntry. برای مثال، برای انجام عملیات ثبت، اشکال‌زدایی، یا ردیابی برای هر ورودی.
  • NavEntrys را با همان تابع ترکیب‌پذیر بپوشانید.
  • پاک‌سازی وضعیت مرتبط با NavEntry. برای مثال، وقتی ورودی‌ای از پشته قبلی‌ها برداشته می‌شود، ViewModelStoreNavEntryDecorator ViewModelStore مرتبط با آن را پاک می‌کند.

از تزئینات برای موارد زیر استفاده نکنید:

  • وابستگی را به یک NavEntry منتقل کنید.
  • وابستگی‌هایی ارائه دهید که دامنه آن‌ها گسترده‌تر از پشته قبلی‌ها باشد.

در هر دو مورد، وابستگی را مستقیماً هنگام ایجاد NavEntry ارسال کنید.

برای نمونه‌های کد بیشتر، NavEntryDecorator را ببینید.