كتابة الأمان في Kotlin DSL والتنقل Compose

يمكنك استخدام واجهات برمجة التطبيقات الآمنة المضمَّنة لتوفير أمان نوع وقت التجميع للرسم البياني للتنقّل. تتوفّر واجهات برمجة التطبيقات هذه عندما يستخدم تطبيقك ميزة التنقل Compose أو Navigation Kotlin DSL. ستكون متوفّرة اعتبارًا من Navigation 2.8.0.

تعادل واجهات برمجة التطبيقات هذه ما توفّره الوسيطات الآمنة للرسومات البيانية للتنقّل في ملفات موارد XML المضمّنة.

تحديد المسارات

لاستخدام مسارات آمنة من حيث الكتابة في Compose، تحتاج أولاً إلى تحديد الفئات أو الكائنات القابلة للتسلسل التي تمثل مساراتك.

  • كائن: استخدم كائن للمسارات بدون وسيطات.
  • الفئة: استخدِم فئة أو فئة بيانات للمسارات التي تحتوي على الوسيطات.
  • KClass<T>: استخدِم هذا الخيار إذا لم تكن بحاجة إلى تمرير وسيطات، مثل فئة بدون مَعلمات، أو فئة تحتوي فيها جميع المَعلمات على قيم تلقائية.
    1. على سبيل المثال: Profile::class

وفي كلتا الحالتين، يجب أن يكون الكائن أو الفئة تسلسليًا.

مثلاً:

// Define a home route that doesn't take any arguments
@Serializable
object Home

// Define a profile route that takes an ID
@Serializable
data class Profile(val id: String)

إنشاء الرسم البياني

بعد ذلك، تحتاج إلى تحديد الرسم البياني للتنقل. استخدِم الدالة composable() لتحديد العناصر القابلة للإنشاء كوجهات في الرسم البياني للتنقّل.

NavHost(navController, startDestination = Home) {
     composable<Home> {
         HomeScreen(onNavigateToProfile = { id ->
             navController.navigate(Profile(id))
         })
     }
     composable<Profile> { backStackEntry ->
         val profile: Profile = backStackEntry.toRoute()
         ProfileScreen(profile.id)
     }
}

لاحظ ما يلي في هذا المثال:

  • تأخذ composable() معلمة type. وهذا يعني، composable<Profile>.
  • يُعدّ تحديد نوع الوجهة طريقة أكثر فعالية من تمرير سلسلة route كما في composable("profile").
  • تحدّد فئة المسار نوع كل وسيطة تنقُّل، كما في val id: String، لذلك لا حاجة إلى NavArgument.
  • بالنسبة إلى مسار الملف الشخصي، تعيد طريقة الإضافة toRoute() إنشاء الكائن Profile من NavBackStackEntry ووسيطاته.

لمزيد من المعلومات حول كيفية تصميم الرسم البياني بشكل عام، راجع صفحة تصميم الرسم البياني للتنقل.

أخيرًا، يمكنك الانتقال إلى العنصر القابل للإنشاء باستخدام الوظيفة navigate() من خلال المرور بمثيل المسار:

navController.navigate(Profile(id = 123))

وسيؤدّي ذلك إلى نقل المستخدم إلى وجهة composable<Profile> في الرسم البياني للتنقّل. يمكن الحصول على أي وسيطات تنقّل، مثل id، من خلال إعادة إنشاء Profile باستخدام NavBackStackEntry.toRoute وقراءة خصائصه.

مصادر إضافية