تتيح لك واجهة برمجة تطبيقات إنشاء التنقل إمكانية التنقل بين العناصر القابلة للإنشاء في تطبيق "إنشاء"، مع الاستفادة من مكوّن ميزة "التنقل" في Jetpack وبنيتها وميزاتها.
توضّح هذه الصفحة كيفية نقل البيانات من واجهة مستخدم Jetpack Navigation المستندة إلى "المقاطع" إلى واجهة مستخدم Navigation Compose، وذلك كجزء من عملية نقل البيانات الأكبر حجمًا لواجهة المستخدم المستندة إلى "العروض" إلى واجهة مستخدم Compose في Jetpack.
المتطلبات الأساسية لنقل البيانات
يمكنك نقل البيانات إلى ميزة "إنشاء التنقّل" بعد أن تتمكّن من استبدال كلّ المقاطع بعناصر قابلة للتجميع على الشاشة. يمكن أن تحتوي العناصر القابلة للإنشاء على الشاشة على مزيج من محتوى الإنشاء والعرض، ولكن يجب أن تكون جميع وجهات التنقّل قابلة للإنشاء للتمكّن من نقل البيانات من خلال ميزة "إنشاء التنقل". وحتى ذلك الحين، يجب مواصلة استخدام مكوّن التنقّل المستنِد إلى الأجزاء في قاعدة بيانات View و Compose للتوافق. راجِع مستندات إمكانية التشغيل التفاعلي للتنقّل للحصول على مزيد من المعلومات.
وتجدر الإشارة إلى أنّ استخدام ميزة "إنشاء التنقل" في تطبيق "إنشاء" فقط ليس شرطًا أساسيًا. يمكنك متابعة استخدام مكوِّن التنقّل المستند إلى التجزئة ما دمت تحتفظ بأجزاء من استضافة المحتوى القابل للإنشاء.
خطوات نقل البيانات
سواء كنت تتّبع استراتيجية نقل البيانات المقترَحة أو تتّبع نهجًا آخر، ستصل إلى نقطة تكون فيها جميع وجهات التنقّل عناصر قابلة للتجميع على الشاشة، وتعمل "المقاطع" فقط كمحاويات قابلة للتجميع. في هذه المرحلة، يمكنك الانتقال إلى ميزة "إنشاء التنقل".
إذا كان تطبيقك يتّبع نمط تصميم متفرّق (UDF) ودليلنا إلى البنية الهندسية، يجب ألا يتطلب الانتقال إلى Jetpack Compose وCompose Compose إعادة ضبط أساسية لطبقات التطبيق الأخرى، باستثناء طبقة واجهة المستخدم.
لنقل الرسائل إلى ميزة "التنقّل والإنشاء"، اتّبِع الخطوات التالية:
- أضِف تبعية ميزة "إنشاء التنقل" إلى تطبيقك.
أنشِئ عنصر
App-level
قابلاً للإنشاء وأضِفه إلىActivity
كنقطة إدخال "إنشاء" مع استبدال إعداد تنسيق "العرض":class SampleActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // setContentView<ActivitySampleBinding>(this, R.layout.activity_sample) setContent { SampleApp(/* ... */) } } }
أنشئ أنواعًا لكل وجهة تنقّل. استخدِم
data object
لتحديد الوجهات التي لا تتطلّب أي بيانات، واستخدِمdata class
أوclass
لتحديد الوجهات التي تتطلّب بيانات.@Serializable data object First @Serializable data class Second(val id: String) @Serializable data object Third
يجب إعداد
NavController
في مكان يتيح لجميع العناصر القابلة للإنشاء التي يجب الرجوع إليها الوصول إليها (يكون هذا عادةً داخلApp
القابل للإنشاء). ويتبع هذا النهج مبادئ رفع الحالات ويتيح لك استخدامNavController
كمصدر الحقيقة للتنقّل بين الشاشات القابلة للإنشاء والحفاظ على حزمة الخلفية:@Composable fun SampleApp() { val navController = rememberNavController() // ... }
أنشئ
NavHost
تطبيقك داخل العنصر القابل للتجميعApp
وأرسِلnavController
:@Composable fun SampleApp() { val navController = rememberNavController() SampleNavHost(navController = navController) } @Composable fun SampleNavHost( navController: NavHostController ) { NavHost(navController = navController, startDestination = First) { // ... } }
أضِف وجهات
composable
لإنشاء رسم بياني للتنقّل. إذا سبق نقل كل شاشة إلى أداة "الإنشاء"، تتألف هذه الخطوة فقط من استخراج مكونات الشاشة هذه من "المقاطع" إلىcomposable
الوجهات التالية:class FirstFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { return ComposeView(requireContext()).apply { setContent { // FirstScreen(...) EXTRACT FROM HERE } } } } @Composable fun SampleNavHost( navController: NavHostController ) { NavHost(navController = navController, startDestination = First) { composable<First> { FirstScreen(/* ... */) // EXTRACT TO HERE } composable<Second> { SecondScreen(/* ... */) } // ... } }
إذا اتّبعت الإرشادات المتعلقة بإنشاء واجهة مستخدم Compose، وتحديدًا كيفية تمرير
ViewModel
وأحداث التنقّل إلى عناصر قابلة للإنشاء، تكمن الخطوة التالية في تغيير طريقة تقديم السمةViewModel
إلى كل شاشة قابلة للإنشاء. يمكنك في كثير من الأحيان استخدام ميزة "حقن Hilt" ونقطة دمجها مع Compose وNavigation من خلالhiltViewModel
:@Composable fun FirstScreen( // viewModel: FirstViewModel = viewModel(), viewModel: FirstViewModel = hiltViewModel(), onButtonClick: () -> Unit = {}, ) { // ... }
استبدِل جميع طلبات التنقّل
findNavController()
بطلباتnavController
وقدِّمها كأحداث تنقّل إلى كل شاشة قابلة للتجميع، بدلاً من تمريرnavController
بالكامل. يتّبع هذا النهج أفضل الممارسات لعرض الأحداث من الدوالّ القابلة للتجميع للمتصلين وي يحافظ علىnavController
كمصدر واحد للحقائق.يمكن تمرير البيانات إلى وجهة من خلال إنشاء مثيل لفئة مسار المحدّدة لتلك الوجهة. ويمكن الحصول عليه إما مباشرةً من إدخال الحزمة الخلفية في الوجهة أو من
ViewModel
باستخدام السمةSavedStateHandle.toRoute()
.@Composable fun SampleNavHost( navController: NavHostController ) { NavHost(navController = navController, startDestination = First) { composable<First> { FirstScreen( onButtonClick = { // findNavController().navigate(firstScreenToSecondScreenAction) navController.navigate(Second(id = "ABC")) } ) } composable<Second> { backStackEntry -> val secondRoute = backStackEntry.toRoute<Second>() SecondScreen( id = secondRoute.id, onIconClick = { // findNavController().navigate(secondScreenToThirdScreenAction) navController.navigate(Third) } ) } // ... } }
يجب إزالة جميع أجزاء التجزئة وتنسيقات XML ذات الصلة والانتقالات غير الضرورية والموارد الأخرى، والتبعيات القديمة لكل من Fragment وJetpack للتنقّل.
يمكنك العثور على الخطوات نفسها مع المزيد من التفاصيل المتعلقة بميزة "إنشاء التنقل" في مستندات الإعداد.
حالات الاستخدام الشائعة
بغض النظر عن مكوّن التنقّل الذي تستخدمه، تنطبق مبادئ التنقّل نفسها.
تتضمّن حالات الاستخدام الشائعة عند نقل البيانات ما يلي:
- الانتقال إلى عنصر قابل للتجميع
- التنقّل باستخدام الوسيطات
- الروابط لصفحات في التطبيق
- التنقُّل المتداخل
- الدمج مع شريط التنقّل السفلي
- الدمج مع مكوِّن تنقّل مخصَّص
للحصول على معلومات أكثر تفصيلاً حول حالات الاستخدام هذه، يمكنك الاطلاع على التنقل باستخدام ميزة الإنشاء.
استرداد البيانات المعقدة عند التنقل
ننصح بشدة بعدم تمرير عناصر البيانات المعقّدة أثناء التنقّل. بدلاً من ذلك، يمكنك ضبط الحد الأدنى من المعلومات اللازمة، مثل معرّف فريد أو شكل آخر من المعرّفات، كوسيطات عند تنفيذ إجراءات التنقّل. ويجب تخزين العناصر المعقدة كبيانات في مصدر واحد للحقيقة، مثل طبقة البيانات. لمزيد من المعلومات، يُرجى الاطّلاع على استرداد البيانات المعقدة عند التنقّل.
إذا كانت المقاطع تمرّر عناصر معقّدة كوسيطات، ننصحك بإعادة صياغة الرمز البرمجي أولاً، بطريقة تسمح بتخزين هذه العناصر واستردادها من طبقة البيانات. يمكنك الاطّلاع على الميزات المتوفّرة الآن في مستودع Android للاطّلاع على مثالين.
القيود
يصف هذا القسم القيود الحالية لميزة "إنشاء التنقل".
نقل بيانات إضافي إلى ميزة "إنشاء التنقل"
في الوقت الحالي، لا يمكنك استخدام ميزة "إنشاء التنقل" مع الاستمرار في استخدام "أجزاء" كوجهات في التعليمات البرمجية. لبدء استخدام ميزة "إنشاء التنقل"، يجب أن تكون جميع الوجهات قابلة للإنشاء. يمكنك تتبُّع طلب الميزة هذا على "أداة تتبُّع المشاكل".
المؤثرات الحركية الانتقالية
اعتبارًا من الإصدار Navigation 2.7.0-alpha01، أصبح من الممكن الآن ضبط التحولات المخصّصة، التي كانت متوفرة سابقًا في AnimatedNavHost
، في NavHost
مباشرةً. اطّلِع على ملاحظات الإصدار للحصول على
مزيد من المعلومات.
مزيد من المعلومات
لمزيد من المعلومات عن نقل البيانات إلى ميزة "التنقّل والإنشاء"، يُرجى الاطّلاع على المراجع التالية:
- الدرس التطبيقي حول الترميز الخاص بإنشاء التنقل: يمكنك التعرّف على أساسيات ميزة "إنشاء التنقل" باستخدام درس تطبيقي حول الترميز.
- الآن في مستودع Android: تطبيق Android وظيفي بالكامل تم إنشاؤه بالكامل باستخدام Kotlin وJetpack Compose، ويتّبع أفضل الممارسات المتعلّقة بتصميم Android وتطويره، ويتضمن Navigation Compose.
- نقل بيانات تطبيق Sunflower إلى Jetpack Compose: وهي مشاركة مدوّنة توثّق رحلة نقل نموذج تطبيق Sunflower من تطبيق "Views" إلى "Compose"، بالإضافة إلى عملية الانتقال إلى "التنقل Compose".
- تطبيق Jetnews لكل شاشة: مشاركة مدوّنة توثّق عملية إعادة صياغة نموذج تطبيق Jetnews ونقله لتتوافق مع جميع الشاشات باستخدام Jetpack Compose وNavigation Compose
أفلام مُقترَحة لك
- ملاحظة: يتم عرض نص الرابط عندما تكون لغة JavaScript غير مفعّلة.
- التنقّل باستخدام ميزة "الإنشاء"
- إنشاء المحتوى والمكتبات الأخرى
- اعتبارات أخرى