میتوانید اطلاعات بیشتری ارائه دهید یا منطق یکسانی را بااستفاده از کلاس 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ارائه دهید.NavDisplayrememberDecoratedNavEntriesرا در پشت صحنه فراخوانی میکند و ورودیهای تزئینشده را نمایش میدهد.
گنجاندن تزئینکننده پیشفرض
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ایجاد میکند. - نتایج را منتقل کنید و بین مقصدها ارتباط برقرار کنید. برای مثال،
ResultEventBusNavEntryDecoratorResultEventBusرا برای مقصدهای موجود در پشته قبلیها ارائه میدهد. - دامنه شیء را به چند
NavEntryمحدود کنید. برای مثال، برای همرسانیViewModelبین چند ورودی. - انجام دادن کنش یکسان برای چند
NavEntry. برای مثال، برای انجام عملیات ثبت، اشکالزدایی، یا ردیابی برای هر ورودی. NavEntrys را با همان تابع ترکیبپذیر بپوشانید.- پاکسازی وضعیت مرتبط با
NavEntry. برای مثال، وقتی ورودیای از پشته قبلیها برداشته میشود،ViewModelStoreNavEntryDecoratorViewModelStoreمرتبط با آن را پاک میکند.
از تزئینات برای موارد زیر استفاده نکنید:
- وابستگی را به یک
NavEntryمنتقل کنید. - وابستگیهایی ارائه دهید که دامنه آنها گستردهتر از پشته قبلیها باشد.
در هر دو مورد، وابستگی را مستقیماً هنگام ایجاد NavEntry ارسال کنید.
برای نمونههای کد بیشتر، NavEntryDecorator را ببینید.