رفرفة تحت الغطاء: ملزمة

هذا المقال هو استمرار مباشر لمقالتي السابقة .



للحصول على تصور كامل ، أنصحك بقراءة المقالة المشار إليها على الرابط أولاً أو تحديثها في ذاكرتك. في ذلك ، قمت بتحليل أحد الجوانب المهمة لجهاز Flutter - تفاعل الأشجار وتوزيع المسؤولية بينها. ومع ذلك ، يبقى السؤال مفتوحًا: كيف يتم تنظيم تشغيل الآلية بأكملها الموصوفة في الجزء الأول؟ هذا ما سنحاول فهمه في هذه المقالة.







الأحكام العامة



إذا قمت بفتح النظرة العامة الفنية على Flutter ، فسنرى الرسم التخطيطي التالي في إحدى النقاط. يُظهر المستويات الشرطية التي يقسمها مؤلفو إطار العمل بأنفسهم. 



مخطط إطار الرفرفة


في الواقع ، كما أطلقوا عليها بأنفسهم ، نرى كعكة نفخة. يمكن تمييز طبقات أكبر وأصغر.



مستوى إطار العمل هو كل شيء نعمل معه وقت كتابة التطبيق ، وجميع فئات المرافق التي تسمح لنا بالتفاعل مع مستوى المحرك الذي كتبناه. كل ما يتعلق بهذا المستوى مكتوب في Dart.



مستوى المحرك - مستوى أقل من مستوى إطار العمل ، ويحتوي على فئات ومكتبات تسمح لمستوى إطار العمل بالعمل. بما في ذلك الجهاز الظاهري Dart و Skia وما إلى ذلك.



طبقة النظام الأساسي -  آليات خاصة بالمنصة خاصة بمنصة الإطلاق.



دعونا نلقي نظرة فاحصة على مستوى الإطار. في الرسم التخطيطي ، يظهر في شكل طبقات من مستوى أعلى إلى مستوى منخفض. في الجزء السفلي نرى طبقةمؤسسة . كما يوحي الاسم ، هذه الطبقة هي شيء أساسي وأساسي على مستوى إطار العمل. نجد هذه المكتبة وهذا ما هو مكتوب في وصفها:



أساسيات إطار عمل Core Flutter.

الميزات المحددة في هذه المكتبة هي فئات المرافق ذات المستوى الأدنى والوظائف المستخدمة بواسطة جميع الطبقات الأخرى في إطار عمل Flutter.




الوظائف المحددة في هذه المكتبة هي فئات الأدوات والوظائف ذات المستوى الأدنى التي تستخدمها جميع الطبقات الأخرى في إطار عمل Flutter.



تحتوي هذه المكتبة أيضًا على BindingBase - الفئة الأساسية لجميع التجليد.



ربط



أولاً ، دعنا نفهم ما هو الربط وكيف يستخدمه Flutter. يخبرنا الاسم نفسه أن هذا نوع من الاتصال. تخبرنا الوثائق التي تركها أمر Flutter لـ BaseBinding بما يلي:



الفئة الأساسية للمزيجات التي توفر خدمات فردية (تُعرف أيضًا باسم "الروابط"). لاستخدام هذه الفئة في جملة on من mixin ، ورث منها وتنفيذ [initInstances ()]. يتم ضمان إنشاء المزيج مرة واحدة فقط في عمر التطبيق (بشكل أكثر دقة ، سيتم التأكيد عليه إذا تم إنشاؤه مرتين في الوضع المحدد).



هذه هي الفئة الأساسية لخدمات الاتصالات المختلفة ، والتي يتم تقديمها على شكل مزيج. تتم تهيئة كل مزيج من هذا القبيل ويضمن تفرد مثيله خلال عمر التطبيق.



BaseBindingهي فئة أساسية مجردة ، فلنلقِ نظرة بعد ذلك على التطبيقات الملموسة للارتباطات. من بينها سنرى:



ServicesBinding مسؤولة عن إعادة توجيه الرسائل من النظام الأساسي الحالي إلى معالج بيانات الرسائل (BinaryMessenger) ؛ يعتبر



PaintingBinding مسؤولاً عن التواصل مع مكتبة العرض.



يعتبر RenderBinding مسؤولاً عن الاتصال بين شجرة العرض ومحرك Flutter.



WidgetBinding هو المسؤول عن الاتصال بين شجرة عناصر واجهة المستخدم ومحرك Flutter.



المجدول هو برنامج جدولة للمهام العادية ، مثل:



  • المكالمات إلى عمليات الاستدعاء الواردة التي يبدأها النظام في Window.onBeginFrame - على سبيل المثال ، أحداث شريط الأسهم ووحدة التحكم في الرسوم المتحركة ؛
  • استدعاءات عمليات الاستدعاء المستمرة التي يبدأها نظام Window.onDrawFrame ، على سبيل المثال ، أحداث لتحديث نظام العرض بعد اكتمال عمليات الاسترجاعات الواردة ؛
  • استدعاءات ما بعد الإطار ، والتي يتم استدعاؤها بعد عمليات الاسترجاعات المستمرة ، قبل العودة من Window.onDrawFrame ؛
  • مهام غير عرضية يجب إجراؤها بين الإطارات.


الربط الدلالي مسؤول عن ربط طبقة الدلالات ومحرك الرفرفة.



GestureBinding مسؤول عن العمل مع النظام الفرعي للإيماءات .



كما يوحي الاسم ، الروابط هي طبقة اتصال بين مستوى محرك Flutter ومستوى الإطار نفسه ، كل منها مسؤول عن اتجاه معين للعمل.



الحاجيات



لفهم كيفية عمل كل شيء معًا بشكل أفضل ، دعنا نلقي نظرة على المكان الذي يمثل نقطة البداية لأي تطبيق Flutter - استدعاء runApp. الطريقة التي نطلبها موجودة في ملف inding.dart وهذا ليس من قبيل الصدفة. يقول الوصف الخاص به أنه يوسع عنصر واجهة التطبيق الذي تم تمريره ويربطه بالشاشة. دعونا نرى ماذا يفعل:



void runApp(Widget app) {
  WidgetsFlutterBinding.ensureInitialized()
    ..scheduleAttachRootWidget(app)
    ..scheduleWarmUpFrame();
}


هذا هو المكان الذي نلتقي فيه مع WidgetsFlutterBinding - تنفيذ ملموس لربط التطبيق بناءً على إطار عمل عنصر واجهة المستخدم. في جوهره ، هو الغراء الذي يربط بين إطار Flutter والمحرك. يتكون WidgetsFlutterBinding من العديد من الارتباطات التي ناقشناها سابقًا: GestureBinding و ServicesBinding و SchedulerBinding و PaintingBinding و SemanticsBinding و RendererBinding و WidgetsBinding . وهكذا ، حصلنا على طبقة يمكنها ربط تطبيقنا في جميع الاتجاهات الضرورية بمحرك Flutter.



دعنا نعود إلى إطلاق التطبيق. في WidgetsFlutterBindingيتم استدعاء التابعين ScheduleAttachRootWidget و ScheduleWarmUpFrame ، فلنرى ما يحدث فيهما.



ScheduleAttachRootWidget



طريقة ScheduleAttachRootWidget هي تنفيذ مؤجل لـ attachRootWidget. هذه الطريقة تنتمي إلى WidgetsBinding . يوضح الوصف الخاص به أنه يرفق عنصر واجهة المستخدم الذي تم تمريره بـ renderViewElement - العنصر الجذر لشجرة العناصر. 



void attachRootWidget(Widget rootWidget) {
    _renderViewElement = RenderObjectToWidgetAdapter<RenderBox>(
      container: renderView,
      debugShortDescription: '[root]',
      child: rootWidget,
    ).attachToRenderTree(buildOwner, renderViewElement);
}


من الكود ، يمكننا أن نرى أن هذه الطريقة تنشئ RenderObjectToWidgetAdapter ، وهو عنصر واجهة مستخدم الجذر لشجرة عنصر واجهة المستخدم ويستخدم كجسر يربط الأشجار ببعضها البعض. بالنظر إلى تنفيذه ، سنرى أنه لا يُنشئ RenderObject لنفسه ، ولكنه يُرجع قيمة من حقل الحاوية ، ونمرر عرض العرض من RendererBinding إليه عندما نقوم بإنشائه. يعتبر عرض العرض هذا هو العنصر الجذر لشجرة العرض.



RenderView الحصول على renderView => _pipelineOwner.rootNode ؛



إن PipelineOwner هو في الواقع المدير الذي يدير عملية العرض.



العودة إلى طريقة attachRootWidget... يتم استدعاء طريقة attachToRenderTree على المحول الذي تم إنشاؤه ، والذي من خلاله نقوم بإنشاء جذر شجرة العناصر لأول مرة. وتجدر الإشارة إلى أنه تم تمرير buildOwner إلى التابع attachToRenderTree . هذه الفئة عبارة عن مدير بناء شجرة عناصر واجهة المستخدم الذي يراقب حالة الأدوات ، ويراقب الحاجة إلى التحديثات وينفذ عددًا من المهام المهمة الأخرى المتعلقة بتحديث حالة شجرة عناصر واجهة المستخدم. وبالتالي ، نحصل على أشجار Flutter الثلاثة ، يتم تخزين كل منها وإدارتها من خلال عمليات الربط.



ScheduleWarmUpFrame



و scheduleWarmUpFrame طريقة ينتمي إلى SchedulerBinding ويستخدم لتحديد موعد لعقد الإطار لتبدأ في أقرب وقت ممكن دون انتظار إشارة نظام "VSYNC". نظرًا لاستخدام الطريقة أثناء بدء تشغيل التطبيق ، فإن الإطار الأول ، الذي من المحتمل أن يكون مكلفًا للغاية ، سيستغرق بعض الوقت الإضافي لإطلاقه. تمنع هذه الطريقة إرسال الأحداث حتى اكتمال الإطار المجدول.



كما نرى ، فإن كلا الآليتين اللتين تم إطلاقهما عند بدء التشغيل تتعلقان بالترابطات المختلفة وتتفاعلان معها ، والتي بدورها ترتبط ارتباطًا وثيقًا وتوفر التفاعل مع النظام. دعونا نلخص الرسم البياني التالي.







خاتمة



الروابط هي آلية مهمة لتنظيم تطبيق Flutter. إنه هو الذي يربط جوانب مختلفة من التطبيق مع بعضها البعض ، وكذلك مع المحرك.



بما في ذلك الشكر له ، يمكننا كتابة تطبيقنا على أعلى مستوى من إطار العمل ، دون القلق بشأن كيفية تنظيم العمل المتماسك لكل شيء آخر. آمل أن تساعدك هذه المقالة في فهم هذا الجزء من جهاز Flutter.



شكرآ لك على أهتمامك!



المواد المستخدمة:



رفرفة

https://flutter.dev/



All Articles