يمكنك تقديم معلومات إضافية أو تطبيق المنطق نفسه على وجهات باستخدام الفئة 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. تكون هذه الدالة مفيدة عندما يكون لديك عدة حِزم سابقة، كل منها يتضمّن مجموعة خاصة من أدوات التزيين (راجِع وصفة التعليمات البرمجية هذه لمزيد من التفاصيل). تُرجع الدالة قائمة مزيّنة منNavEntryيمكنك استخدامها معNavDisplay. - قدِّم أداة التزيين مباشرةً إلى
NavDisplayباستخدام المَعلمةentryDecorators. تُجري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
بدءًا من الإصدار 3 1.2.0 من Navigation، يمكنك استخدام
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بين عدة إدخالات. - تنفيذ الإجراء نفسه لعدة
NavEntrys على سبيل المثال، لتنفيذ عمليات التسجيل أو تصحيح الأخطاء أو التتبُّع لكل إدخال. - لفّ
NavEntrys باستخدام الدالة المركّبة نفسها. - محو الحالة المرتبطة بـ
NavEntryعلى سبيل المثال، عند إزالة إدخال من الأنشطة السابقة، يمحوViewModelStoreNavEntryDecoratorViewModelStoreالمرتبط به.
لا تستخدِم أداة تزيين في الحالات التالية:
- تمرير عنصر تابع إلى
NavEntryواحد - قدِّم عناصر التبعية التي يكون نطاقها أوسع من حزمة الخلف.
في كلتا الحالتين، مرِّر العنصر التابع مباشرةً عند إنشاء NavEntry بدلاً من ذلك.
للاطّلاع على المزيد من أمثلة الرموز، راجِع NavEntryDecorator.