بااستفاده از کلاس 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در پشت صحنه و ورودیهای تزئینشده را نمایش میدهد.
افزودن تزئینکننده پیشفرض
«پیمایش ۳» شامل تزئینکنندهای پیشفرض بهنام
SaveableStateHolderNavEntryDecorator است که امکان میدهد وضعیت NavEntry در
تغییرات پیکربندی و پایان فرایند حفظ شود. محتوای NavEntry را با SaveableStateProvider میپیچد که باعث میشود
تماسهای rememberSaveable درون محتوای NavEntry بهدرستی کار کنند.
مگر اینکه دکوراتور شما SaveableStateProvider را ارائه دهد، باید
SaveableStateHolderNavEntryDecorator را بهعنوان اولین دکوراتور در
فهرست دکوراتورهای ارائهشده خود اضافه کنید. بااستفاده از
rememberSaveableStateHolderNavEntryDecorator ایجاد شده است.
برای مثال:
// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator NavDisplay( entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), remember { CustomNavEntryDecorator() } ), // ... )
گذراندن نتایج بااستفاده از ResultEventBusNavEntryDecorator
از «پیمایش ۳» ۱.۲.۰، میتوانید از
ResultEventBusNavEntryDecorator برای ارائه
ResultEventBus به هر NavEntry بااستفاده از
ترکیب محلی LocalResultEventBus استفاده کنید.
بهطور پیشفرض، rememberResultEventBusNavEntryDecorator نمونه ResultEventBus خود را بهصورت داخلی بااستفاده از rememberResultEventBus ایجاد و بهخاطر میسپارد. اگر نیاز دارید خارج از سلسلهمراتب تزئینکننده (مثلاً در داربست برنامه سطح بالا) به گذرگاه رویداد دسترسی پیدا کنید، میتوانید با فراخوانی rememberResultEventBus و انتقال آن به rememberResultEventBusNavEntryDecorator(resultEventBus)، ResultEventBus را بالا ببرید:
val resultEventBus = rememberResultEventBus() NavDisplay( /* ... */ entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), rememberResultEventBusNavEntryDecorator(resultEventBus = resultEventBus) ) )
برای جزئیات بیشتر درباره ارسال و مشاهده نتایج، به برگرداندن نتایج مراجعه کنید.
چه زمانی از تزئینکننده استفاده کنیم
از تزئینکننده برای موارد زیر استفاده کنید:
- برای هر
NavEntryدر پشته برگشت، وابستگی ایجاد کنید. برای مثال،ViewModelStoreNavEntryDecoratorبرای هرNavEntryیکViewModelStoreایجاد میکند. - نتایج را منتقل کنید و بین مقصدها ارتباط برقرار کنید. برای مثال،
ResultEventBusNavEntryDecoratorResultEventBusرا برای مقصدها در پشته برگشت ارائه میدهد. - دامنه شیء را به چند
NavEntryمحدود کنید. برای مثال، برای همرسانیViewModelبین چند ورودی. - همین کنش را برای چند
NavEntryانجام دهید. برای مثال، برای انجام عملیات گزارشگیری، اشکالزدایی، یا ردیابی برای هر ورودی. -
NavEntryرا با همان تابع ترکیبپذیر دربر بگیرید. - وضعیت منسوب به
NavEntryثانیه پاکسازی میشود. برای مثال، وقتی ورودی از پشته پشتی برداشته میشود،ViewModelStoreNavEntryDecoratorViewModelStoreمنسوب به آن را پاک میکند.
از تزئینکننده برای موارد زیر استفاده نکنید:
- وابستگی را به یک
NavEntryمنتقل کنید. - وابستگیهایی را ارائه دهید که محدوده آنها گستردهتر از پشته برگشت باشد.
در هر دو این موارد، وابستگی را مستقیماً هنگام ایجاد NavEntry
بهجای آن منتقل کنید.
برای نمونههای کد بیشتر، NavEntryDecorator را ببینید.