ينشئ العنصر القابل للإنشاء Grid تصاميم شاشة ثنائية الأبعاد ذات بنية.
تحدّد Grid بنية تنسيق متجاوب باستخدام مسارات محددة بوضوح (صفوف وأعمدة) وفواصل كبنية أساسية لواجهة المستخدم.
بما أنّ Grid هي حاوية هيكلية وليست حاوية للتحميل الكسول، فهي تتطلّب منك تحديد كل عنصر يتم وضعه بداخلها بشكل صريح بدون إعادة تدوير العناصر عند التمرير.
نتيجةً لذلك، قد يؤدي عرض مجموعات البيانات الكبيرة أو الديناميكية مباشرةً ضمن Grid إلى حدوث اختناقات في الأداء، لأنّ جميع العناصر يتم إنشاؤها في الوقت نفسه.
لعرض مجموعات كبيرة من البيانات ضمن تنسيق شاشة منظَّم، يمكنك تضمين مكوّنات يتم تحميلها عند الحاجة، مثل LazyColumn أو LazyRow، في خلايا Grid.
يُرجى العِلم أنّ المسارات المرنة (التي تتضمّن مواصفات مثل 1.fr) تستعلم عن الأحجام الأصلية للعناصر الفرعية. بما أنّ SubcomposeLayout لا يتيح عمليات تمرير القياسات المضمّنة، سيؤدي وضع قائمة كسولة داخل مسار مرن إلى حدوث عطل IllegalStateException. لوضع قوائم التحميل الكسول بأمان داخل مسار شبكة مرن، يجب استخدام تحديد الحجم GridTrackSize.MinMax (مثل minmax(0.dp, 1.fr)) لتجاوز عملية القياس المضمّنة.
LazyColumn مضمّنًا للمحتوى.أفضل الممارسات
- استخدام القوائم الكسولة بدلاً من الحلقات الكبيرة الصريحة: لعرض مجموعات بيانات كبيرة أو ديناميكية ضمن
Gridمنظَّمة، يمكنك تضمين مكوّنات كسولة (عادةًLazyColumnأوLazyRow) داخل خلايا شبكة معيّنة بدلاً من إنشاء حلقات كبيرة صريحة للعناصر، لأنّGridلا يعيد تدوير العناصر ويبلغ الحد الأقصى لعدد المقاطع الصوتية فيه 1,000 مقطع. - استخدام
MinMaxلتتبُّع حجم القوائم التي يتم تحميلها عند الطلب: بما أنّLazyColumnوLazyRowلا يتيحان عمليات قياس مضمّنة (راجِعSubcomposeLayout)، استخدِمGridTrackSize.MinMaxفي المسارات المرنة التي تستضيف المكوّنات التي يتم تحميلها عند الطلب لتجاوز عمليات القياس المضمّنة بأمان.
المكوّنات
-
Grid: تخطيط قابل للإنشاء يضع العناصر في بنية شبكة ثنائية الأبعاد تم ضبطها باستخدام مسارات صفوف وأعمدة صريحة. -
LazyColumn: قائمة يمكن تمريرها عموديًا، وتتضمّن العناصر المرئية حاليًا على الشاشة فقط. -
GridTrackSize.MinMax: تتتبّع هذه السمة حجم العنصر الذي يحدّد الحدود المرنة (minوmax) لاستضافة المكوّنات التي يتم تحميلها عند الحاجة بأمان بدون حدوث أعطال في القياس أثناء وقت التشغيل. gridItem: ComposeModifierextension that assigns a child عنصر في واجهة المستخدم to a specific cell or named area inside aGrid.
الخطوات
يمكنك تنظيم تخطيط الشاشة من خلال تحديد معرّفات المناطق الدلالية، وضبط مسارات الشبكة باستخدام حجم minmax لضمان التوافق مع القائمة الكسولة، وتضمين LazyColumn داخل منطقة محتوى الشبكة.
1. ضبط مسارات الشبكة والمناطق المحدّدة
أنشئ فئة enum لتمثيل المناطق المميّزة في تخطيط الشاشة،
وحدِّد تعبير GridConfigurationScope lambda لمسارات التخطيط والمناطق المسماة. استخدِم GridTrackSize.MaxContent لصفوف الرأس والتذييل لتناسب أبعاد المحتوى، واستخدِم minmax(0.dp, 1.fr) لمسار المحتوى الذي يستضيف القائمة الكسولة لتخصيص مساحة مرنة بدون طلب قياسات داخلية غير متوافقة:
enum class ScreenArea { Header, Content, Footer } val lazyConfig: GridConfigurationScope.() -> Unit = { column(minmax(0.dp, 1.fr)) row(GridTrackSize.MaxContent) row(minmax(0.dp, 1.fr)) row(GridTrackSize.MaxContent) area(ScreenArea.Header, row = 1, column = 1) area(ScreenArea.Content, row = 2, column = 1) area(ScreenArea.Footer, row = 3, column = 1) gap(8.dp) }
2. وضع المكوّنات الثابتة في "الشبكة"
في الدالة المركّبة، اضبط lazyConfig على الحاوية Grid. داخل دالة
content lambda، ضَع المكوّنات الثابتة (Header وFooter) وحدِّد موضعها
باستخدام Modifier.gridItem() مع معرّفات المناطق الخاصة بها.
3- تضمين LazyColumn في مساحة المحتوى
في خلية المحتوى، ادمِج LazyColumn باستخدام Modifier.gridItem(ScreenArea.Content).
بما أنّه تم ضبط مسار المحتوى باستخدام minmax(0.dp, 1.fr) في الخطوة 1،
يمكن لـ LazyColumn قياس العناصر وإعادة استخدامها بأمان عند التمرير بدون طلب سمات داخلية غير متوافقة:
@Composable fun GridWithLazyColumn( modifier: Modifier = Modifier, items: List<String> = emptyList(), ) { Grid( modifier = modifier.fillMaxSize(), config = lazyConfig ) { Text("Header", Modifier.gridItem(ScreenArea.Header).padding(16.dp)) Text("Footer", Modifier.gridItem(ScreenArea.Footer).padding(16.dp)) // LazyColumn placed in the content area for large datasets LazyColumn( modifier = Modifier .gridItem(ScreenArea.Content) .fillMaxSize(), verticalArrangement = Arrangement.spacedBy(8.dp) ) { items(items) { item -> Text(item, Modifier.padding(16.dp)) } } } }
النتائج
يستخدِم تخطيط الشاشة الآن واجهة برمجة التطبيقات Grid لتحديد البنية العامة ثنائية الأبعاد للصفحة، مع تضمين LazyColumn في مسار مرن بحجم minmax لإعادة استخدام عناصر القائمة بكفاءة وتجنُّب استثناءات وقت التشغيل.