الدفعة
أي عدد من العدسات، بقراءة واحدة للخلفية — على Impeller.
تعمل العدسة على Impeller بقراءة ما رُسم خلفها ثم تشغيل شيدر الزجاج فوق تلك النسخة. والقراءة هي الجزء الغالي، وهي لكل عدسة: عشرون بطاقة زجاجية في قائمة تعني عشرين قراءة في الإطار، وأربعين مع الضبابية. لُفَّها بـ LiquidGlassBatch فتُوسَم كلها بمفتاح خلفية مشترك واحد، فيأخذ المحرك النسخة مرة واحدة ويعاينها كل عضو.
LiquidGlassBatch(
child: ListView.builder(
itemCount: 40,
itemBuilder: (context, i) => LiquidGlassLens(
style: cardStyle,
child: Card(i),
),
),
)ولا يتغيّر شيء آخر في الأعضاء: يحتفظ كلٌّ بشكله وأسلوبه وابنه وتكيّفه واستجابته للمس. ويبقون ألواحاً زجاجية منفصلة — الدفعة تجعلهم يتشاركون القراءة فحسب. ويُعثر على الأعضاء بالسياق فيجلسون على أي عمق، وتنضم المكوّنات بالطريقة نفسها: الزر وزر الإجراء العائم والشريط العلوي وكبسولة شريط التبويب وLiquidGlassSheet الموضوعة في الشجرة — أيٌّ منها داخل الدفعة يتشارك قراءتها بلا أي توصيل. والاستثناء الوحيد ما يعرضه showLiquidGlassSheet وshowLiquidGlassDialog: فهو مسار خارج شجرة كل دفعة، فيأخذ قراءة خاصة به ما لم يطلب الاستدعاء الانضمام إلى واحدة — انظر الملاحظة أدناه.
| المعامل | الافتراضي | ما يفعله |
|---|---|---|
child | — | الشجرة الفرعية التي يتشارك أحفادها من LiquidGlassLens القراءة. |
enabled | true | اقلبه إلى false فتعود كل عدسة إلى قراءة خاصة بها — السلوك ما قبل الدفعة، وهو المقارنة التي تقيس بها ما توفّره الدفعة. |
دفعة أم خالط؟#
يرسم الخالط أعضاءه بـشيدر واحد: ظلّ واحد ومادة واحدة وقراءة واحدة — وثمانية أعضاء على الأكثر، لأن كل ما يرسمه يجب أن يتّسع في ذلك الشيدر. ومع smoothness: 0 لا يصهرهم أصلاً؛ فهو مرور واحد للطقم، وهذا ما كان LiquidGlassGroup المهمَل. أما الدفعة فلا تشارك سوى القراءة. يبقى الأعضاء مرورات منفصلة بمظاهرهم، ولا حدّ لعددهم. فمدّ يدك إلى الخالط حين ينبغي أن تُقرأ العدسات قطعةَ زجاج واحدة، وإلى الدفعة حين تكون كثيرة فحسب. وهما يتداخلان: الخالط داخل دفعة عضوٌ كأي عضو، يُرسم من نسخة الدفعة.
القاعدة الوحيدة: يجب ألا يتراكب الأعضاء#
يعاين كل عضو النسخة نفسها، المأخوذة قبل أن يرسم أيٌّ منهم — فلا يستطيع عضو أن يرى زجاج عضو آخر. وحيث يتراكب اثنان يكسر الأعلى ما كان خلف الأسفل، فتُقرأ الطبقتان كعدسة واحدة. والقوائم والشبكات وصفوف عناصر التحكم لا تقع في هذا أبداً. أما العدسة التي يجب أن تتراكب مع أخرى فمكانها خارج الدفعة:
LiquidGlassBatch(
child: Column(
children: [
Expanded(child: cards), // shared read
LiquidGlassBatch.exclude( // its own read again
child: myTabBar,
),
],
),
)أين ينطبق#
المفتاح المشترك آلية Impeller، فالدفعة هي ما يغيّر الكلفة هناك. أما على مسار التقاط Skia والويب فإن LiquidGlassView يلتقط خلفيته مرة واحدة لكل عدسة بداخله أصلاً، فالدفعة خاملة لا خاطئة — والشجرة نفسها تعمل على الواجهتين.
طبقة زجاج واحدة، تطفو فوق الصفحة#
توجد الدفعة لأن قراءة الخلفية هي الشيء الغالي الذي يفعله Impeller، وتشاركها هو أكبر توفير منفرد متاح على ذلك المحرك — عدسات كثيرة بثمن واحدة. لكن يجدر قول ما الدفعة من أجله، لأن التخطيطات التي تجعلها رخيصة هي نفسها التخطيطات الصحيحة.
الزجاج طبقة تحكّم. وينبغي في كل الحالات تقريباً أن يكون طبقة واحدة تطفو فوق الصفحة — شريطاً أو طقم عناصر تحكم أو صفَّ إجراءات — والمحتوى يمرّ تحتها. وهذا ما وُجدت المادة من أجله: أن ترى ما تحت الزجاج، ولهذا يكسر بدل أن يحجب.
التعليقات
التعليقات هي مناقشات GitHub — يمكنك الرد من أيٍّ من المكانين.