يمكنك تقديم معلومات إضافية أو تطبيق المنطق نفسه على
الوجهات باستخدام فئة NavEntryDecorator. تلتف هذه الفئة حول كل
NavEntry في الأنشطة السابقة باستخدام دالة مركّبة. بعبارة أخرى،
يُزيّن محتوى الإدخال.
إنشاء عنصر تزيين مخصّص
لإنشاء عنصر تزيين، يمكنك توسيع فئة NavEntryDecorator وإلغاء
الطرق التالية:
-
decorate: دالة lambda مركّبة يتم استدعاؤها لكل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. تكون هذه الدالة مفيدة عندما يكون لديك عدة أنشطة سابقة، ولكل منها مجموعة من أدوات التزيين (يُرجى الاطّلاع على وصفة الرمز هذه لمزيد من التفاصيل). تُرجع الدالة قائمة مزخرفة منNavEntrys التي يمكنك استخدامها معNavDisplay. - يمكنك تقديم الديكور مباشرةً إلى
NavDisplayباستخدام المَعلمةentryDecorators. يستدعيNavDisplayrememberDecoratedNavEntriesفي الخلفية ويعرض الإدخالات المزخرفة.
تضمين المُزيِّن التلقائي
يتضمّن Navigation 3 عنصر تزيين تلقائيًا باسم
SaveableStateHolderNavEntryDecorator يتيح الاحتفاظ بحالة NavEntry
من خلال تغييرات الإعدادات وإيقاف العملية نهائيًا. يتم تضمين محتوى NavEntry في SaveableStateProvider، ما يتيح لطلبات rememberSaveable داخل محتوى NavEntry العمل بشكل صحيح.
ما لم يوفّر المنسّق SaveableStateProvider، عليك
تضمين SaveableStateHolderNavEntryDecorator كأول منسّق في
قائمة المنسّقين المقدَّمين. تم إنشاؤه باستخدام
rememberSaveableStateHolderNavEntryDecorator.
على سبيل المثال:
// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator NavDisplay( entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), remember { CustomNavEntryDecorator() } ), // ... )
تمرير النتائج باستخدام ResultEventBusNavEntryDecorator
بدءًا من الإصدار 1.2.0 من Navigation 3، يمكنك استخدام
ResultEventBusNavEntryDecorator لتوفير
ResultEventBus لكل NavEntry باستخدام
LocalResultEventBus composition local.
تلقائيًا، ينشئ rememberResultEventBusNavEntryDecorator مثيل ResultEventBus الخاص به ويتذكره داخليًا باستخدام rememberResultEventBus. إذا كنت بحاجة إلى الوصول إلى مسار الأحداث خارج التسلسل الهرمي للمزخرف (مثل المستوى الأعلى من هيكل التطبيق)، يمكنك رفع ResultEventBus من خلال استدعاء rememberResultEventBus وتمريره إلى rememberResultEventBusNavEntryDecorator(resultEventBus):
val resultEventBus = rememberResultEventBus() NavDisplay( /* ... */ entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), rememberResultEventBusNavEntryDecorator(resultEventBus = resultEventBus) ) )
لمزيد من التفاصيل حول إرسال النتائج ومراقبتها، يُرجى الاطّلاع على عرض النتائج.
حالات استخدام أداة التزيين
استخدِم عنصر تزيين لإجراء ما يلي:
- أنشئ تبعية لكل
NavEntryفي الأنشطة السابقة. على سبيل المثال، ينشئViewModelStoreNavEntryDecoratorViewModelStoreلكلNavEntry. - تمرير النتائج والتواصل بين الوجهات على سبيل المثال، يوفّر
ResultEventBusNavEntryDecoratorResultEventBusللوجهات في الأنشطة السابقة. - تحديد نطاق عنصر لعدة
NavEntry. على سبيل المثال، لمشاركةViewModelبين إدخالات متعددة. - يمكنك تنفيذ الإجراء نفسه على عدة
NavEntry. على سبيل المثال، لإجراء عمليات التسجيل أو تصحيح الأخطاء أو التتبُّع لكل إدخال. - يمكنك تضمين
NavEntryفي الدالة المركّبة نفسها. - تنظيف الحالة المرتبطة بـ
NavEntrys على سبيل المثال، عند إزالة إدخال من الأنشطة السابقة، يمحوViewModelStoreNavEntryDecoratorالـViewModelStoreالمرتبط به.
لا تستخدِم عنصر تزيين من أجل:
- يمكنك تمرير تبعية إلى
NavEntryواحد. - توفير التبعيات التي يكون نطاقها أوسع من الأنشطة السابقة
في كلتا الحالتين، يمكنك تمرير التبعية مباشرةً عند إنشاء NavEntry
بدلاً من ذلك.
لمزيد من الأمثلة على الرموز، يُرجى الاطّلاع على NavEntryDecorator.