صباح الخير ..
انا بقالي فتره كبيره بعيد عن كتابة المحتوى الخاص ب Flutter لكني هشارككم النهارده تجربتي مع استخدام Provider في مشروع متوسط الحجم وهقدملك كتير من المعلومات اللي هتحتاج تعرفها فاقرا البوست للاخر للأهمية..
لو انت لسه مبتدئ ف غالبا الكلام هيكون صعب عليك شويه.
كان قراري الشخصي باستخدام ال Provider ليه عدة اسباب منها:
ارتياحي لل architecture اللي بيقوم عليه ال Provider واللي بيشبه الطريقة اللي Flutter بتستخدمها علشان تعمل Update لل widget state.
ال Code Flexibility اللي بيقدمها ال Provider واللي بتتيحلك استخدامه في اكتر من مكان داخل المشروع "بشرط تنظيم الكود".
مكانش عندي تخوفات من قدرة ال Provider انه يشيل مشروع بحجم متوسط.
أماكن استخدام ال Provider داخل المشروع:
إستخدام ال Provider كان في مكانين:
أول مكان في ال View layer فيه مجموعة Providers منفصلين تماماً عن ال View model layer الغرض منها بس هندلة التغييرات اللي بتحصل ف ال widgets اللي مابتحتاجش اي نوع من انواع الداتا اللي موجوده في ال model ولا كمان بتحتاج تدخل من ال handlers لعدم وجود heavy logic to organize يعني ببساطة هو بس موجود علشان يتحكم في ال widgets اللي كل تغييراتها قائمة على ال UI بعيد تماما عن ال data وال business logic وتعقيداتها. ودي حجمها صغير مقارنة بالاستخدام التاني.
تاني مكان وهو الاستخدام الحيوي لل Providers في view model layer .. مجوعة كبيرة من ال Providers اللي بيحتوي على ال business logic واللي بيدير بشكل كبير أغلب ال behaviors جوه الأبليكيشن واللي كلامي هيكون عنهم.
المميزات:
طبيعة ال provider انه singleton مكننا من استغلال النقطه دي لصالحنا في كتير من المواضع اللي بتستخدم نفس ال value في اكتر من مكان زي مثلاً احتياجنا ل token holder ثابت طول ال user journey ولحد ما يقفل الابليكيشن.
سهولة التعامل مع التغييرات وصغر حجم الكود اللي بتكتبه علشان تقدر تعمل set وانك مش بتحتاج مجهود كبير علشان تقدر تعمل retrieve & update واللي بتحصل بشكل instant و efficient.
مرونة الكود اللي تقدر تكتبه جوه ال Provider class واللي تقدر تكتب فيه كل ال Business logic بتاعك بشرط انك تراعي ال SRP علشان الكود بتاعك من السهل جدا انه يبقى messy code.
العيوب:
في كتير من الأوقات هتحتاج تستخدم ال Provider داخل ال initState ولكن مش هتعرف لانه بيحتاج context وده مش بيكون متوفر في ال init فبيكون قدامك حل من اتنين ..
1- انك تستخدمه داخل ال didChangeDependencies وده مش دايماً أفضل حل بسبب ال Unexpected behavior اللي ممكن تقابله لو انت مش فاهم طبيعة ال didChangeDependencies.
2- انك تستخدمه داخل ال init من خلال Future.delayed أو WidgetsBinding وده الحل الأفضل من وجهة نظري.
ال Provider ليست controller قائمة بذاتها بمعنى ان قدرة ال Provider لو انت عايز تستخدمه as orchestrator ضعيفه جداً وبيحتاج Orchestrator layer فوقيها لأسباب كتيره منها:
- ال Provider مايقدرش يكلم other provider بشكل مباشر فهتحتاج orchestrator تباصيله ال Providers اللي هيستخدمها كنوع من أنواع ال method dependency injection.
- الكود بتاعك هيبقى messy code لو مفيش layer تجبر الكود انه يبقى one direction flow والوضع هيزداد سوء كل ما زاد عدد ال features وتداخلها لدرجة انه ممكن يعقد عملية تعديل أو مسح أي كود مكتوب.
ضرورة انتباهك للوقت اللي تستخدم فيها listen: false نظرا لكون ال default قيمته true.
باختصار:
ال Provider ممتاز جداً .. سهل وسريع وبسيط.
لو مش فاهم طبيعة ال Provider هتلاقي نفسك بتسئ استخدامه في كتير من الأوقات بسبب ال Flexibility.
ال Provider بيحتاج layer فوقيه تنظم كل ال events علشان تقدر تستفيد منه الاستفاده القصوى من غير ما تكتب كود متداخل وغير مرتب.
ده كان نظرة عامة وخلاصة تجربة ان شاء الله تفيدك وشرفني برأيك لو شايف حاجه غلط.
#flutter #provider
#منقول
انا بقالي فتره كبيره بعيد عن كتابة المحتوى الخاص ب Flutter لكني هشارككم النهارده تجربتي مع استخدام Provider في مشروع متوسط الحجم وهقدملك كتير من المعلومات اللي هتحتاج تعرفها فاقرا البوست للاخر للأهمية..
لو انت لسه مبتدئ ف غالبا الكلام هيكون صعب عليك شويه.
كان قراري الشخصي باستخدام ال Provider ليه عدة اسباب منها:
ارتياحي لل architecture اللي بيقوم عليه ال Provider واللي بيشبه الطريقة اللي Flutter بتستخدمها علشان تعمل Update لل widget state.
ال Code Flexibility اللي بيقدمها ال Provider واللي بتتيحلك استخدامه في اكتر من مكان داخل المشروع "بشرط تنظيم الكود".
مكانش عندي تخوفات من قدرة ال Provider انه يشيل مشروع بحجم متوسط.
أماكن استخدام ال Provider داخل المشروع:
إستخدام ال Provider كان في مكانين:
أول مكان في ال View layer فيه مجموعة Providers منفصلين تماماً عن ال View model layer الغرض منها بس هندلة التغييرات اللي بتحصل ف ال widgets اللي مابتحتاجش اي نوع من انواع الداتا اللي موجوده في ال model ولا كمان بتحتاج تدخل من ال handlers لعدم وجود heavy logic to organize يعني ببساطة هو بس موجود علشان يتحكم في ال widgets اللي كل تغييراتها قائمة على ال UI بعيد تماما عن ال data وال business logic وتعقيداتها. ودي حجمها صغير مقارنة بالاستخدام التاني.
تاني مكان وهو الاستخدام الحيوي لل Providers في view model layer .. مجوعة كبيرة من ال Providers اللي بيحتوي على ال business logic واللي بيدير بشكل كبير أغلب ال behaviors جوه الأبليكيشن واللي كلامي هيكون عنهم.
المميزات:
طبيعة ال provider انه singleton مكننا من استغلال النقطه دي لصالحنا في كتير من المواضع اللي بتستخدم نفس ال value في اكتر من مكان زي مثلاً احتياجنا ل token holder ثابت طول ال user journey ولحد ما يقفل الابليكيشن.
سهولة التعامل مع التغييرات وصغر حجم الكود اللي بتكتبه علشان تقدر تعمل set وانك مش بتحتاج مجهود كبير علشان تقدر تعمل retrieve & update واللي بتحصل بشكل instant و efficient.
مرونة الكود اللي تقدر تكتبه جوه ال Provider class واللي تقدر تكتب فيه كل ال Business logic بتاعك بشرط انك تراعي ال SRP علشان الكود بتاعك من السهل جدا انه يبقى messy code.
العيوب:
في كتير من الأوقات هتحتاج تستخدم ال Provider داخل ال initState ولكن مش هتعرف لانه بيحتاج context وده مش بيكون متوفر في ال init فبيكون قدامك حل من اتنين ..
1- انك تستخدمه داخل ال didChangeDependencies وده مش دايماً أفضل حل بسبب ال Unexpected behavior اللي ممكن تقابله لو انت مش فاهم طبيعة ال didChangeDependencies.
2- انك تستخدمه داخل ال init من خلال Future.delayed أو WidgetsBinding وده الحل الأفضل من وجهة نظري.
ال Provider ليست controller قائمة بذاتها بمعنى ان قدرة ال Provider لو انت عايز تستخدمه as orchestrator ضعيفه جداً وبيحتاج Orchestrator layer فوقيها لأسباب كتيره منها:
- ال Provider مايقدرش يكلم other provider بشكل مباشر فهتحتاج orchestrator تباصيله ال Providers اللي هيستخدمها كنوع من أنواع ال method dependency injection.
- الكود بتاعك هيبقى messy code لو مفيش layer تجبر الكود انه يبقى one direction flow والوضع هيزداد سوء كل ما زاد عدد ال features وتداخلها لدرجة انه ممكن يعقد عملية تعديل أو مسح أي كود مكتوب.
ضرورة انتباهك للوقت اللي تستخدم فيها listen: false نظرا لكون ال default قيمته true.
باختصار:
ال Provider ممتاز جداً .. سهل وسريع وبسيط.
لو مش فاهم طبيعة ال Provider هتلاقي نفسك بتسئ استخدامه في كتير من الأوقات بسبب ال Flexibility.
ال Provider بيحتاج layer فوقيه تنظم كل ال events علشان تقدر تستفيد منه الاستفاده القصوى من غير ما تكتب كود متداخل وغير مرتب.
ده كان نظرة عامة وخلاصة تجربة ان شاء الله تفيدك وشرفني برأيك لو شايف حاجه غلط.
#flutter #provider
#منقول
❤19👍8🥰2
ممكن حد يفهمني اي هو ال
Profile mode in flutter ؟
الاجابه ⬅️
Profile mode
هو mode الخاص بتتبع وتحليل الأداء بتاع الابلكيشن زي مساحته و استهلاكه لل network او battery او storage وغيرهم ، مش بيشتغل علي emulator او simulator ،
لازم جهاز حقيقي زي ال release mode كده عشان يقدر يديلك الأداء الحقيقي
flutter run --profile
#منقول
Profile mode in flutter ؟
الاجابه ⬅️
Profile mode
هو mode الخاص بتتبع وتحليل الأداء بتاع الابلكيشن زي مساحته و استهلاكه لل network او battery او storage وغيرهم ، مش بيشتغل علي emulator او simulator ،
لازم جهاز حقيقي زي ال release mode كده عشان يقدر يديلك الأداء الحقيقي
flutter run --profile
#منقول
❤22👍7🔥4👏3🥰1
🤔9❤8🔥5👍1
هي async و await بيعملوا ايه ومعناهم ايه اصلا ؟! تعالي اجاوبك
عندنا dart بتشتغل ب single thread وده معناه انها شغاله علي thread واحد بال memory بتاعته الخاصه وبتنفذ كل حاجه عليه.
طيب ولو عايز انفذ حاجتين مع بعض في نفس الوقت اعمل ايه؟
هنا يجيي عندنا مفهومين لازم نفهم كويس وهم parallelism و concurrency.
ال parallelism هو القدره انك توزع ال tasks بتاعتك علي كذا thread وعندنا في dart ال thread بيتمثل في حاجه اسمها isolate وبيتم التواصل بين ال isolates وبعض عن طريق ال messaging، المميز في dart هنا ان كل isolate ليه ال memory بتعته يعني مش هيحصل اي conflict بين ال isolates زي مثلا ان ال isolates يغييروا قيمة variable واحد مع بعض.
ال concurrency هي القدره انك تنفذ كذا task علي نفس ال thread في نفس الوقت ان امكن، يعني مثلا انا عندي 2 tasks فاشتغل علي اول task شويه بعديين اروح اشتغل علي التانيه شويه بعيين علي الاولي شويه وهكذا.
هنلاقي ان await و async بيقعوا تحت مفهوم ال concurrency بكل بساطة async بتديني القدره ان اوقف تنفيذ ال function اللي انا فيها حاليا عشان انتظر اللي هو ا await نتيجة معينه بس بقيه ال app شغال عادي مش واقف، انا هنا بوقف ال async function بس، انما بقية ال app شغال عادي.
ال async هنا بتقول لل event loop كمل انت في شغلك عادي خالص بس اعمل حسابك هيجيلك response كذا وقتها كمل ال function دي.
#منقول
عندنا dart بتشتغل ب single thread وده معناه انها شغاله علي thread واحد بال memory بتاعته الخاصه وبتنفذ كل حاجه عليه.
طيب ولو عايز انفذ حاجتين مع بعض في نفس الوقت اعمل ايه؟
هنا يجيي عندنا مفهومين لازم نفهم كويس وهم parallelism و concurrency.
ال parallelism هو القدره انك توزع ال tasks بتاعتك علي كذا thread وعندنا في dart ال thread بيتمثل في حاجه اسمها isolate وبيتم التواصل بين ال isolates وبعض عن طريق ال messaging، المميز في dart هنا ان كل isolate ليه ال memory بتعته يعني مش هيحصل اي conflict بين ال isolates زي مثلا ان ال isolates يغييروا قيمة variable واحد مع بعض.
ال concurrency هي القدره انك تنفذ كذا task علي نفس ال thread في نفس الوقت ان امكن، يعني مثلا انا عندي 2 tasks فاشتغل علي اول task شويه بعديين اروح اشتغل علي التانيه شويه بعيين علي الاولي شويه وهكذا.
هنلاقي ان await و async بيقعوا تحت مفهوم ال concurrency بكل بساطة async بتديني القدره ان اوقف تنفيذ ال function اللي انا فيها حاليا عشان انتظر اللي هو ا await نتيجة معينه بس بقيه ال app شغال عادي مش واقف، انا هنا بوقف ال async function بس، انما بقية ال app شغال عادي.
ال async هنا بتقول لل event loop كمل انت في شغلك عادي خالص بس اعمل حسابك هيجيلك response كذا وقتها كمل ال function دي.
#منقول
❤31👍9
الفرق بين
💥 ListViewBuilder and
💥 SliverList
في هذا المقال سوف نناقش الفرق بين ListViewBuilder and SliverList
ولماذا نحتاج إلى استخدام SliverList بدلا من ListViewBuilder في بعض الوقت ....
تخيل معي أن تصميمك هو عبارة عن
واجهة فيها ListView
داخل هذي الليست أبناء هم عنوان الليست و قائمة من العناصر مثل ListViewBuilder
انت بحاجة إلى عمل scroll لشاشة الهاتف وسيعمل scrolling تحريك للعنوان مع عناصر الليست الأب كمان ....
خلينا نعتبر أن التصميم بيكون
ListView
داخلها
Text
ListViewBuilder
هنا بتكون في إشكالية من ناحية الأداء خلونا نوضحها ببساطة:
اذا استخدمت اي ListViewBuilder
داخل scrollable widget مثل
ListView او SingleChildScrollView او ListViewBuilder
داخل ListViewBuilder
في هذي الحالة سوف يقوم ListViewBuilder برسم كل العناصر بنفس الوقت
اقصد لو الليست تتكون من 1000 سوف يقوم برسم كل العناصر بنفس الوقت مما قد يحدث إنهاك للذاكرة وقد يعلق التطبيق .
طب ايش الحل
تعال معي نشرحه ببساطة :
استخدم SliverList
داخلCustomScrollView
هذي افضل طريقة لإصلاح هذا العبث
وسيقوم برسم العناصر الظاهر على الشاشة فقط بدون رسم اي عنصر لم يظهر على الشاشة لما تعمل scroll
وانتهى 😁...
شكرا حبايب
واذا في اي تعديل أو خطأ ممكن تشاركنا رأيك في التعليقات
#منقول
⬅️⬅️ تعليق علي خطأ في الكلام
الـ listviewBuilder مش بيبني العناصر مرة واحد بيبني مع تحريك ال list الـ list view العاديه هيا اللي بتعمل بناء علي طول لكل children
💥 ListViewBuilder and
💥 SliverList
في هذا المقال سوف نناقش الفرق بين ListViewBuilder and SliverList
ولماذا نحتاج إلى استخدام SliverList بدلا من ListViewBuilder في بعض الوقت ....
تخيل معي أن تصميمك هو عبارة عن
واجهة فيها ListView
داخل هذي الليست أبناء هم عنوان الليست و قائمة من العناصر مثل ListViewBuilder
انت بحاجة إلى عمل scroll لشاشة الهاتف وسيعمل scrolling تحريك للعنوان مع عناصر الليست الأب كمان ....
خلينا نعتبر أن التصميم بيكون
ListView
داخلها
Text
ListViewBuilder
هنا بتكون في إشكالية من ناحية الأداء خلونا نوضحها ببساطة:
اذا استخدمت اي ListViewBuilder
داخل scrollable widget مثل
ListView او SingleChildScrollView او ListViewBuilder
داخل ListViewBuilder
في هذي الحالة سوف يقوم ListViewBuilder برسم كل العناصر بنفس الوقت
اقصد لو الليست تتكون من 1000 سوف يقوم برسم كل العناصر بنفس الوقت مما قد يحدث إنهاك للذاكرة وقد يعلق التطبيق .
طب ايش الحل
تعال معي نشرحه ببساطة :
استخدم SliverList
داخلCustomScrollView
هذي افضل طريقة لإصلاح هذا العبث
وسيقوم برسم العناصر الظاهر على الشاشة فقط بدون رسم اي عنصر لم يظهر على الشاشة لما تعمل scroll
وانتهى 😁...
شكرا حبايب
واذا في اي تعديل أو خطأ ممكن تشاركنا رأيك في التعليقات
#منقول
⬅️⬅️ تعليق علي خطأ في الكلام
الـ listviewBuilder مش بيبني العناصر مرة واحد بيبني مع تحريك ال list الـ list view العاديه هيا اللي بتعمل بناء علي طول لكل children
❤23👍10🔥1
مساء الخير
هتكلم النهارده شوية عن Dart وفي نهاية البوست هتلاقي challenge بسيطه لو حليتها فانت مش محتاج تقرا البوست.
مفهوم ال asynchronization في لغة Dart:
كتير من اللغات بتقدر تحقق مفهوم ال parallelism عن طريق انها تستخدم ال multithreading بمعنى انه يكون فيه اكتر من thread بيتشاركوا نفس المكان من ال memory وكل thread تشتغل على تاسك منفصله وبالتالي الوقت الكلي المستخدم لتنفيذ N من التاسكات في وجود N من ال threads هيساوي نفس الوقت المستخدم لتنفيذ تاسك واحده فقط وده طبعًا بيعلي السرعه والكفاءة.
للأسف Dart مش واحده من اللغات دي رغم انها بتديلك الإمكانية انك تعمل ده ولكن ده مش الشكل الافتراضي ليها ولا ده موطن قوة dart وده اللي بيصعب على Flutter بناء تطبيقات بتستخدم resources كبيره من ال cpu زي انك تعمل image processing لان النوعيه دي من التاسكات بتحتاج انها تستخدم كل cpu core ممكنه.
طيب ازاي Dart بتقدر تنفذ async tasks رغم كونها بتشتغل على thread واحده ؟
بتقدر تنفذ ده عن طريق استخدام event queue ينظم عملية دخول ال events بكل انواعها سواء كانت I/O event او cpu event او Future event وهنا بييجي دور ال event loop في انها تعمل processing للايفنت اللي عليه الدور لو كان sync فبتنفذه وتدخل على التاسك اللي بعده ولو كان Future فبتركنه لحد ما يحصلها hock trigger يقولها ان ال Future خلص ومستني processing.
من الاخر يعني Dart مش بتميز بين ال events ومش بتضطرك تكتب كود ولا تعمل مجهود علشان تقدر تنفذ async task لان ال event loop ذكيه كفايه انها تقدر تفهم انها مش محتاجه تستنى event ممكن ياخد ثواني على ما يحصل في حين انه لغات زي java و swift بيضطروك تكتب ال async task بطريقه معينه لانهم بيستخدموا ال multithreading فبيخلوا كل Async task تشتغل في thread منفصله علشان مايحصلش lock لل main thread وهي بتستنى ال Future انه يخلص.
بمعنى ان Dart مش بتحقق مفهوم ال parallelism ولكنها بتحقق مفهوم مشابه لل parallelism اسمه ال concurrency.
ال event loop بتتعامل مع التاسكات بالترتيب ده (من الأسرع للأبطأ)
1- sync task: print("task");
2- async microtask: Future.microtask(()=>print("microtask"));
3- async task: Future(()=>print("async task"));
بعد ما عرفت كل ده خليني اقولك ان Dart بتستخدم حاجه اسمها isolate وهي زي ال thread ولكنها مختلفه في ان كل isolate ليها dedicated memory خاصه بيها هي فقط وبتتيحلك انك تستخدم multi isolates سواء عن طريق ال low level كود من خلال spawn أو الأفضل تستخدم ال Function اللي وفرتها Flutter واللي هي compute ولكنها محدوده بعض الشئ في استخداماتها وبتحط عليك restrictions لانه زي ماتفقنا دي مش موطن قوة Dart.
وأخيراً حاول تحل ال challenge البسيطه دي علشان تتأكد انك فهمت كلامي أو اسألني فيه.
void main() async{
print("A");
await Future((){
print("B");
Future(()=>print("C"));
Future.microtask(()=>print("D"));
Future(()=>print("E"));
print("F");
});
print("G");
}
#flutter
#شرح
#منقول
هتكلم النهارده شوية عن Dart وفي نهاية البوست هتلاقي challenge بسيطه لو حليتها فانت مش محتاج تقرا البوست.
مفهوم ال asynchronization في لغة Dart:
كتير من اللغات بتقدر تحقق مفهوم ال parallelism عن طريق انها تستخدم ال multithreading بمعنى انه يكون فيه اكتر من thread بيتشاركوا نفس المكان من ال memory وكل thread تشتغل على تاسك منفصله وبالتالي الوقت الكلي المستخدم لتنفيذ N من التاسكات في وجود N من ال threads هيساوي نفس الوقت المستخدم لتنفيذ تاسك واحده فقط وده طبعًا بيعلي السرعه والكفاءة.
للأسف Dart مش واحده من اللغات دي رغم انها بتديلك الإمكانية انك تعمل ده ولكن ده مش الشكل الافتراضي ليها ولا ده موطن قوة dart وده اللي بيصعب على Flutter بناء تطبيقات بتستخدم resources كبيره من ال cpu زي انك تعمل image processing لان النوعيه دي من التاسكات بتحتاج انها تستخدم كل cpu core ممكنه.
طيب ازاي Dart بتقدر تنفذ async tasks رغم كونها بتشتغل على thread واحده ؟
بتقدر تنفذ ده عن طريق استخدام event queue ينظم عملية دخول ال events بكل انواعها سواء كانت I/O event او cpu event او Future event وهنا بييجي دور ال event loop في انها تعمل processing للايفنت اللي عليه الدور لو كان sync فبتنفذه وتدخل على التاسك اللي بعده ولو كان Future فبتركنه لحد ما يحصلها hock trigger يقولها ان ال Future خلص ومستني processing.
من الاخر يعني Dart مش بتميز بين ال events ومش بتضطرك تكتب كود ولا تعمل مجهود علشان تقدر تنفذ async task لان ال event loop ذكيه كفايه انها تقدر تفهم انها مش محتاجه تستنى event ممكن ياخد ثواني على ما يحصل في حين انه لغات زي java و swift بيضطروك تكتب ال async task بطريقه معينه لانهم بيستخدموا ال multithreading فبيخلوا كل Async task تشتغل في thread منفصله علشان مايحصلش lock لل main thread وهي بتستنى ال Future انه يخلص.
بمعنى ان Dart مش بتحقق مفهوم ال parallelism ولكنها بتحقق مفهوم مشابه لل parallelism اسمه ال concurrency.
ال event loop بتتعامل مع التاسكات بالترتيب ده (من الأسرع للأبطأ)
1- sync task: print("task");
2- async microtask: Future.microtask(()=>print("microtask"));
3- async task: Future(()=>print("async task"));
بعد ما عرفت كل ده خليني اقولك ان Dart بتستخدم حاجه اسمها isolate وهي زي ال thread ولكنها مختلفه في ان كل isolate ليها dedicated memory خاصه بيها هي فقط وبتتيحلك انك تستخدم multi isolates سواء عن طريق ال low level كود من خلال spawn أو الأفضل تستخدم ال Function اللي وفرتها Flutter واللي هي compute ولكنها محدوده بعض الشئ في استخداماتها وبتحط عليك restrictions لانه زي ماتفقنا دي مش موطن قوة Dart.
وأخيراً حاول تحل ال challenge البسيطه دي علشان تتأكد انك فهمت كلامي أو اسألني فيه.
void main() async{
print("A");
await Future((){
print("B");
Future(()=>print("C"));
Future.microtask(()=>print("D"));
Future(()=>print("E"));
print("F");
});
print("G");
}
#flutter
#شرح
#منقول
❤8👍4👏4🔥1🥰1🤔1
ازاي تعمل interface في dart
عشان تعمل interface بلغة زي السي شارب بتكتب
interface <interface_name>
وتكتب ت declare methods فيه،
بس dart مافيهاش interface keyword، يبقي ايه الحل ؟ تعالي اقولك ...
ال interface ببساطه هو اللي بيقول ال class ده مطلوب منه ايه بغض النظر عن هيتعمل ازاي، تقدر تقول انه زي مديرك في الشغل بيقولك انا عايزك تعمل كذا، بس تعملها ازاي، دي بتاعتك انت، انت حر، كده كده هتعملها.
تعالي تطبق ده عندنا، مثلا انا عايز احدد ان ال class اللي هيجيب الداتا بتاعه ال authentication
مسئول قدامي انه يعمل login،
بغض النظر عن هيستخدم http او dio المهم عندي انه يعمل كده وانت عشان شاطر وعارف انك لازم تكتب كود يكون flexible معاك ويكون loose coupling
لازم هنا تستخدم ال interface
او ما يسمي بال abstraction.
وده بيتم في دارت من خلال keyword
اسمها abstract
بتحطها قبل كلمة class
وتبدأ تقول انت عايز ال classes
اللي هتورث من ال interface
ده تعمل ايه، تعالي نطبق علي المثال اللي قولناه
هنا هعين مسئول اسمه AuthAPI وهقوله مسؤليتك هتقول للي تحتيك يعملوا login
abstact class AuthAPI{
login();
}
انا قررت استخدم http فقول عامل class اسمه httpAuthCall والكلاس ده هيعمل implement
لل AuthAPI
class HttpAuthCall implements AuthAPI{
@override
login(){ //my code using http pub}
طيب جيت بعدها بفتره لقيت ان ال dio فهل انا لسه هدخل اعدل في الكلاس بتاعي ؟ بكل بساطه انت تعمل كلاس جديد وتسمية مثلا DioAuthCall
وتعمل implement لل AuthAPI
انت هنا من غير ما تاخد بالك طبقت
Open/Closed principle
كتبت clean code وده هيساعدك بعد كده في فانك تطبق ال dependency inversion principle و dependency injection
خليك فاكر ان عشان تعمل interface في دارت لازم الحاجتين دول
abstract و implement
#منقول
عشان تعمل interface بلغة زي السي شارب بتكتب
interface <interface_name>
وتكتب ت declare methods فيه،
بس dart مافيهاش interface keyword، يبقي ايه الحل ؟ تعالي اقولك ...
ال interface ببساطه هو اللي بيقول ال class ده مطلوب منه ايه بغض النظر عن هيتعمل ازاي، تقدر تقول انه زي مديرك في الشغل بيقولك انا عايزك تعمل كذا، بس تعملها ازاي، دي بتاعتك انت، انت حر، كده كده هتعملها.
تعالي تطبق ده عندنا، مثلا انا عايز احدد ان ال class اللي هيجيب الداتا بتاعه ال authentication
مسئول قدامي انه يعمل login،
بغض النظر عن هيستخدم http او dio المهم عندي انه يعمل كده وانت عشان شاطر وعارف انك لازم تكتب كود يكون flexible معاك ويكون loose coupling
لازم هنا تستخدم ال interface
او ما يسمي بال abstraction.
وده بيتم في دارت من خلال keyword
اسمها abstract
بتحطها قبل كلمة class
وتبدأ تقول انت عايز ال classes
اللي هتورث من ال interface
ده تعمل ايه، تعالي نطبق علي المثال اللي قولناه
هنا هعين مسئول اسمه AuthAPI وهقوله مسؤليتك هتقول للي تحتيك يعملوا login
abstact class AuthAPI{
login();
}
انا قررت استخدم http فقول عامل class اسمه httpAuthCall والكلاس ده هيعمل implement
لل AuthAPI
class HttpAuthCall implements AuthAPI{
@override
login(){ //my code using http pub}
طيب جيت بعدها بفتره لقيت ان ال dio فهل انا لسه هدخل اعدل في الكلاس بتاعي ؟ بكل بساطه انت تعمل كلاس جديد وتسمية مثلا DioAuthCall
وتعمل implement لل AuthAPI
انت هنا من غير ما تاخد بالك طبقت
Open/Closed principle
كتبت clean code وده هيساعدك بعد كده في فانك تطبق ال dependency inversion principle و dependency injection
خليك فاكر ان عشان تعمل interface في دارت لازم الحاجتين دول
abstract و implement
#منقول
❤18👍5
يسعد أوقاتكم بكل الخير, بدايةً قبل قراءتك للمنشور علّق بالصلاة على النبي, ثم أكمل قراءة.
التحديثات الجديدة الخاصة بالدارت وفلاتر دسمة جدًا وكثيرة ولا يمكن إجمالها بمنشور, لذلك اليوم سنتحدث عن تحديثات الدارت فقط.
جديد لغة دارت 3.0
أولًا:
Dart Portability:
أصبح بالإمكان ترجمة أكواد dart للعمل على بيئتين جديدتين:
1. Linux RISC-V
2. WebAssembly
وحنتكلم عن الWebAssembly (WASM).
زي ما أنتوا عارفين المشاريع المكتوبة بفلاتر يمكن ترجمتها للعمل على بيئات متعددة, وكذلك يمكن إنشاء تطبيق ويب منها.
دارت يترجم أكواده لما يقابله بالjs كون المتصفحات تتعامل مع الجافاسكريبت (وليس الدارت).
الجديد هنا أنه أصبح بالإمكان تحويل المشروع ل WebAssembly للحصول على أداء أسرع وثقل أقل على الرام.
ثانيًا: Patterns
المقصود بها طرق كتابة أكوادك بشكل أكثر تعبيرًا.
تحديث 1: multiple returns
ويقصد بها أن تعيد أكثر من ناتج للميثود. (بديل الtuple).
لو افترضنا أنك تريد إرجاع بيانات سيارة من ميثود ما (الاسم وسنة الانتاج),
الطريقة الأولى والقديمة أنك تعمل class, وتعرف فيه الاسم وسنة الانتاج, ثم تنشء منه object وتسند له القيم وترجعه للميثود.
class Car{
final String name;
final int year;
Car(this.name,this.year);
}
Car someMethod(String name){
var car = Car(name,2013);
return car;
}
void main(){
var car = someMethod('skoda');
print('${car.name} ${car.year}');
}
الجديد الآن تستطيع إرجاع أكثر من قيمة معًا.
بديل الكود السابق بنفس الناتج:
(String,int) someMethod(String name){
return (name,2013);
}
void main(){
var car = someMethod('skoda');
print('${car.$1} ${car.$2}');
}
أو
void main(){
var (name,year) = someMethod('skoda');
print('$name $year');
}
تحديث 2:
بالإصدارات السابقة كنا نستخدم الif/else في تخصيص List وقت كتابة الكود.
الآن أصبح استخدام if/else على الnamed arguments بنفس الطريقة.
مثال:
ListTile(
title:Text('Some list tile'),
if(enableSubtitle)
...(subTitle:Text('Some subtitle')));
تحديث 3:
الswitch/case كانت تتطلب أمرين:
الأول أنك تمرر constants لcases
الثاني أنك تنهي كل case ب break;
الأمر الأول, أصبحت الcase أكثر مرونة,
مثلًا:
void someMethod(){
switch(something){
case condition1:
..
case condition2:
...
case condition3 when condition 4:
...
default:
...
}
}
الأمر الثاني, بالنسبة لجملة break; سيتم الاستغناء عنها نهاية الcase. لأنها فعليًا بدون معنى ولا قيمة (بس هما ضافوها من باب هذا ما وجدنا عليه آباؤنا).
الأمر الثالث:
بالإمكان دمج أكثر من case بنفس الcase بدلًا من أسطر متتابعة:
مثلًا
switch(someThing){
case condition1:
case condition2:
case condition3:
//your code
}
يمكن كتابتها كذلك:
switch(someThing){
case condition1 condition2 condition3:
//your code
}
مثل ما أشرنا بالأعلى أصبحت مرنة ولا تتطلب وسيطات ثابتة.
الأمر الرابع:
بالإمكان استخدام معاملات المقارنة مباشرة بدون الإشارة كل مرة للمتغير اللي داخل switch:
مثلًا:
switch(age){
case age<5:
...
case age>5 && age <10:
...
}
صار ممكن اختصارها كالتالي:
switch(age){
case <5:
...
case >5 && <10:
...
}
تحديث 4:
تفنيط (فكفكة الjson) والتعامل معه - json
destructuring
لاحظ هالمثال:
var json = {'car':['skoda',2013]};
switch(json){
case {'user':[String name,int year]}:
print('The car $name made in $year');
default:
print('Unkown json pattern');
}
تحديث 5:
تفنيط الObject والتعامل معه: Object destructuring
لاحظ هالمثال:
var cars = {'Skoda':2013, 'Kia':2019};
for(var MapEntry(:name,:year) in cars.entries)
{
print('$name made in $year');
}
هذا جزء من التحديثات المعلنة علمًا بأن النسخة 3.0 من الدارت لم تنزل stable بل ما زالت في dev channel.
بالتوفيق لكم, ولا تنسى تعلّق بالصلاة على النبي - صلى الله عليه وسلم-.
#flutter_forward
#dart_updates
#منقول
التحديثات الجديدة الخاصة بالدارت وفلاتر دسمة جدًا وكثيرة ولا يمكن إجمالها بمنشور, لذلك اليوم سنتحدث عن تحديثات الدارت فقط.
جديد لغة دارت 3.0
أولًا:
Dart Portability:
أصبح بالإمكان ترجمة أكواد dart للعمل على بيئتين جديدتين:
1. Linux RISC-V
2. WebAssembly
وحنتكلم عن الWebAssembly (WASM).
زي ما أنتوا عارفين المشاريع المكتوبة بفلاتر يمكن ترجمتها للعمل على بيئات متعددة, وكذلك يمكن إنشاء تطبيق ويب منها.
دارت يترجم أكواده لما يقابله بالjs كون المتصفحات تتعامل مع الجافاسكريبت (وليس الدارت).
الجديد هنا أنه أصبح بالإمكان تحويل المشروع ل WebAssembly للحصول على أداء أسرع وثقل أقل على الرام.
ثانيًا: Patterns
المقصود بها طرق كتابة أكوادك بشكل أكثر تعبيرًا.
تحديث 1: multiple returns
ويقصد بها أن تعيد أكثر من ناتج للميثود. (بديل الtuple).
لو افترضنا أنك تريد إرجاع بيانات سيارة من ميثود ما (الاسم وسنة الانتاج),
الطريقة الأولى والقديمة أنك تعمل class, وتعرف فيه الاسم وسنة الانتاج, ثم تنشء منه object وتسند له القيم وترجعه للميثود.
class Car{
final String name;
final int year;
Car(this.name,this.year);
}
Car someMethod(String name){
var car = Car(name,2013);
return car;
}
void main(){
var car = someMethod('skoda');
print('${car.name} ${car.year}');
}
الجديد الآن تستطيع إرجاع أكثر من قيمة معًا.
بديل الكود السابق بنفس الناتج:
(String,int) someMethod(String name){
return (name,2013);
}
void main(){
var car = someMethod('skoda');
print('${car.$1} ${car.$2}');
}
أو
void main(){
var (name,year) = someMethod('skoda');
print('$name $year');
}
تحديث 2:
بالإصدارات السابقة كنا نستخدم الif/else في تخصيص List وقت كتابة الكود.
الآن أصبح استخدام if/else على الnamed arguments بنفس الطريقة.
مثال:
ListTile(
title:Text('Some list tile'),
if(enableSubtitle)
...(subTitle:Text('Some subtitle')));
تحديث 3:
الswitch/case كانت تتطلب أمرين:
الأول أنك تمرر constants لcases
الثاني أنك تنهي كل case ب break;
الأمر الأول, أصبحت الcase أكثر مرونة,
مثلًا:
void someMethod(){
switch(something){
case condition1:
..
case condition2:
...
case condition3 when condition 4:
...
default:
...
}
}
الأمر الثاني, بالنسبة لجملة break; سيتم الاستغناء عنها نهاية الcase. لأنها فعليًا بدون معنى ولا قيمة (بس هما ضافوها من باب هذا ما وجدنا عليه آباؤنا).
الأمر الثالث:
بالإمكان دمج أكثر من case بنفس الcase بدلًا من أسطر متتابعة:
مثلًا
switch(someThing){
case condition1:
case condition2:
case condition3:
//your code
}
يمكن كتابتها كذلك:
switch(someThing){
case condition1
//your code
}
مثل ما أشرنا بالأعلى أصبحت مرنة ولا تتطلب وسيطات ثابتة.
الأمر الرابع:
بالإمكان استخدام معاملات المقارنة مباشرة بدون الإشارة كل مرة للمتغير اللي داخل switch:
مثلًا:
switch(age){
case age<5:
...
case age>5 && age <10:
...
}
صار ممكن اختصارها كالتالي:
switch(age){
case <5:
...
case >5 && <10:
...
}
تحديث 4:
تفنيط (فكفكة الjson) والتعامل معه - json
destructuring
لاحظ هالمثال:
var json = {'car':['skoda',2013]};
switch(json){
case {'user':[String name,int year]}:
print('The car $name made in $year');
default:
print('Unkown json pattern');
}
تحديث 5:
تفنيط الObject والتعامل معه: Object destructuring
لاحظ هالمثال:
var cars = {'Skoda':2013, 'Kia':2019};
for(var MapEntry(:name,:year) in cars.entries)
{
print('$name made in $year');
}
هذا جزء من التحديثات المعلنة علمًا بأن النسخة 3.0 من الدارت لم تنزل stable بل ما زالت في dev channel.
بالتوفيق لكم, ولا تنسى تعلّق بالصلاة على النبي - صلى الله عليه وسلم-.
#flutter_forward
#dart_updates
#منقول
❤25👍10🔥1
مهم جدا
, ملخص لل update الجديد في فلاتر لموضوع الحماية الذي تم الإعلان عنهُ في الحدث الجديد يوم أمس .
تكلموا عن هذا الموضوع فريق فلاتر المتحدث :-
Godofredo Contreras و Alexander Thomas
ومن ضمن هذهِ المواضيع تطرقوا لهذه الاشياء :-
1- موضوع ال Authrizations
طبعا ملاحضة بسيطة عشان تكون المعلومه واضحة بشكل اكبر هناك فرق بين ال Authentication و ال Authorization
أفضل طريقة لتوضيح الاختلافات بين المصطلحين هي باستخدام مثال بسيط. لنفترض أنك قررت الذهاب وزيارة منزل أحد الأصدقاء. عند الوصول ، تدق على الباب ، وفتحه صديقك. وتعرف عليك (هذه هي المصادقهAuthentication)
نظرًا لأن صديقك قد تعرف عليك ، فهو الآن مرتاح للسماح لك بالدخول إلى منزله. ومع ذلك ، بناءً على علاقتك ، هناك أشياء معينة يمكنك القيام بها وأخرى لا يمكنك القيام بها (وهذا هو التفويض Authorization).
على سبيل المثال ، قد تدخل منطقة المطبخ ، لكن لا يمكنك الذهاب إلى المكتب الخاص به . بعبارة أخرى ، لديك إذن بالدخول إلى المطبخ ، لكن الدخول إلى مكتبها الخاص محظور. خلاص وهنا قالو لك خذ بالك من حمايه في هذه الموضيع عشان ما تسمح الاي حد يدخل ويأخذ صلاحيه مش مسموح له أن ياخذها إلا بعد اذن ال admin .
2- العبث مع ملفات المشروع او بيئة العمل التي يعمل عليها (السرفر الذي توجد ملفات المشروع بداخلة ) وهذا يسمى compromise source repo
مثال على ذلك :
-التلاعب بأدوات التطوير
-التلاعب ببيئة التطوير
-التلاعب في مستودعات كود المصدر (عامة أو خاصة).
3- ال (build from modified source ) والمقصود به العبث مع مصدر الكود
مثال: أنت عملت متغير ويكون هذا المتغير Global أي بمعنى أنك تقدر تستدعيه وتسند له قيمة من أي
مكان في التطبيق وبهذهِ الطريق أنت تتيح للهاكر ان يقوم بستدعاء هذا المتغير و إدخال قيمه له من أي مكان في التطبيق واستخدامه بشكل ضار لختراق البيانات ... نعطي مثال لهذا الأمر ....مثلًا أنت كنت تتحقق من أن المستخدم
هل بالفعل قد سجل الدخول الى التطبيق أم لا , وذلك عبر إستخدام متغير من نوع boolean اسمه مثلا isAuth مثلاَ طبعا بتكون قيمته مبدأياً تساوي false
وعندما المستخدم يسجل الدخول نقوم بتحويل isAuth الى true عشان لو المستخدم دخل التطبيق مره اخرى نتحقق أنه إذا كانت قيمه ال isAuth تساوي false معناه أنه ماقد سجل الدخول وفي هذه الحاله بنقول
لتطبيق خلاص دام وما سجل الدخول حولة لصفحة تسجيل الدخول وإذا كانت القيمة ب true خلاص بكذا يكون احنا متاكدين أنه المستخدم قد سجل الدخول من قبل وما يحتاج نحولة لصفحة تسجيل الدخول في كل مره يدخل على التطبيق لذلك نحوله للصفحة الرئيسية ..... تمام اوكي الامور ماشي لا حد الان تمام
بس افترض أنه المخترق وصل للمتغير تبعك الي هو (isAuth) الي انت عامله عام ويقدر اي حد يستدعية من اي مكان في التطبيق وحول قيمته الى true قبل ما يسجل الدخول اصلاً 😄 كيف بيكون الوضع....
اكيد با بيحوله للصفحة الرئسية بدون تسجيل دخول لانه اجى يفحص ال isAuth حصل انه قيمته تساوي true وهذهِ مصيبة ال Global varibales وهذا نوع من أنواع ال (compromise source repo).
4- في حالة بناء التطبيق (compromise build process) يمكن اختراق التطبيق عند بداية تشغيلة او عند عمل initialize للتطبيق
وذلك عبر حقن الذاكر المؤقته بالسلوك السيء والتلاعب بها .
3-إستخدام المكتبات او التبعيات(package) الغير موثوق بها وهذا ما يسمى ال use compromised dependence
وهذه تمثل خطر كبير على التطبيق لانه قد ربما يجيك الهاكر يستخدم بعض ال tools من الي موجوده في المكتبه لتساعدة في الحصول على بعض القيم التي اسندتها في المكتبه , ليتم اختراقك بها
وفي نهاية الفيديو قالو لك من شان تتجنب من بعض هذه المشاكل . قالوا لك يا عمي روح استخدم SLSA كمان
ركز انا قولت من بعض المشاكل مش من كل المشاكل لانه SLSA ما بيضمن لك حماية تطبيقك 100 %
* وتكلموا ايضا عن ال flutter automated publishing وعن اهميته في تجنب الكثير من الوقوع في بعض الاخطاء عند عمل publishing في كل مره بشكل يدوي .
خلاص كذا بس هذا ملخص الفيديو الخاص security بالاضافه الى بعض الحاجات الي اضفته من شان توصل الفكرة بشكل سليم .....
رابط الفيديو للحدث :-
https://youtu.be/7LFftXcw1jA
, ملخص لل update الجديد في فلاتر لموضوع الحماية الذي تم الإعلان عنهُ في الحدث الجديد يوم أمس .
تكلموا عن هذا الموضوع فريق فلاتر المتحدث :-
Godofredo Contreras و Alexander Thomas
ومن ضمن هذهِ المواضيع تطرقوا لهذه الاشياء :-
1- موضوع ال Authrizations
طبعا ملاحضة بسيطة عشان تكون المعلومه واضحة بشكل اكبر هناك فرق بين ال Authentication و ال Authorization
أفضل طريقة لتوضيح الاختلافات بين المصطلحين هي باستخدام مثال بسيط. لنفترض أنك قررت الذهاب وزيارة منزل أحد الأصدقاء. عند الوصول ، تدق على الباب ، وفتحه صديقك. وتعرف عليك (هذه هي المصادقهAuthentication)
نظرًا لأن صديقك قد تعرف عليك ، فهو الآن مرتاح للسماح لك بالدخول إلى منزله. ومع ذلك ، بناءً على علاقتك ، هناك أشياء معينة يمكنك القيام بها وأخرى لا يمكنك القيام بها (وهذا هو التفويض Authorization).
على سبيل المثال ، قد تدخل منطقة المطبخ ، لكن لا يمكنك الذهاب إلى المكتب الخاص به . بعبارة أخرى ، لديك إذن بالدخول إلى المطبخ ، لكن الدخول إلى مكتبها الخاص محظور. خلاص وهنا قالو لك خذ بالك من حمايه في هذه الموضيع عشان ما تسمح الاي حد يدخل ويأخذ صلاحيه مش مسموح له أن ياخذها إلا بعد اذن ال admin .
2- العبث مع ملفات المشروع او بيئة العمل التي يعمل عليها (السرفر الذي توجد ملفات المشروع بداخلة ) وهذا يسمى compromise source repo
مثال على ذلك :
-التلاعب بأدوات التطوير
-التلاعب ببيئة التطوير
-التلاعب في مستودعات كود المصدر (عامة أو خاصة).
3- ال (build from modified source ) والمقصود به العبث مع مصدر الكود
مثال: أنت عملت متغير ويكون هذا المتغير Global أي بمعنى أنك تقدر تستدعيه وتسند له قيمة من أي
مكان في التطبيق وبهذهِ الطريق أنت تتيح للهاكر ان يقوم بستدعاء هذا المتغير و إدخال قيمه له من أي مكان في التطبيق واستخدامه بشكل ضار لختراق البيانات ... نعطي مثال لهذا الأمر ....مثلًا أنت كنت تتحقق من أن المستخدم
هل بالفعل قد سجل الدخول الى التطبيق أم لا , وذلك عبر إستخدام متغير من نوع boolean اسمه مثلا isAuth مثلاَ طبعا بتكون قيمته مبدأياً تساوي false
وعندما المستخدم يسجل الدخول نقوم بتحويل isAuth الى true عشان لو المستخدم دخل التطبيق مره اخرى نتحقق أنه إذا كانت قيمه ال isAuth تساوي false معناه أنه ماقد سجل الدخول وفي هذه الحاله بنقول
لتطبيق خلاص دام وما سجل الدخول حولة لصفحة تسجيل الدخول وإذا كانت القيمة ب true خلاص بكذا يكون احنا متاكدين أنه المستخدم قد سجل الدخول من قبل وما يحتاج نحولة لصفحة تسجيل الدخول في كل مره يدخل على التطبيق لذلك نحوله للصفحة الرئيسية ..... تمام اوكي الامور ماشي لا حد الان تمام
بس افترض أنه المخترق وصل للمتغير تبعك الي هو (isAuth) الي انت عامله عام ويقدر اي حد يستدعية من اي مكان في التطبيق وحول قيمته الى true قبل ما يسجل الدخول اصلاً 😄 كيف بيكون الوضع....
اكيد با بيحوله للصفحة الرئسية بدون تسجيل دخول لانه اجى يفحص ال isAuth حصل انه قيمته تساوي true وهذهِ مصيبة ال Global varibales وهذا نوع من أنواع ال (compromise source repo).
4- في حالة بناء التطبيق (compromise build process) يمكن اختراق التطبيق عند بداية تشغيلة او عند عمل initialize للتطبيق
وذلك عبر حقن الذاكر المؤقته بالسلوك السيء والتلاعب بها .
3-إستخدام المكتبات او التبعيات(package) الغير موثوق بها وهذا ما يسمى ال use compromised dependence
وهذه تمثل خطر كبير على التطبيق لانه قد ربما يجيك الهاكر يستخدم بعض ال tools من الي موجوده في المكتبه لتساعدة في الحصول على بعض القيم التي اسندتها في المكتبه , ليتم اختراقك بها
وفي نهاية الفيديو قالو لك من شان تتجنب من بعض هذه المشاكل . قالوا لك يا عمي روح استخدم SLSA كمان
ركز انا قولت من بعض المشاكل مش من كل المشاكل لانه SLSA ما بيضمن لك حماية تطبيقك 100 %
* وتكلموا ايضا عن ال flutter automated publishing وعن اهميته في تجنب الكثير من الوقوع في بعض الاخطاء عند عمل publishing في كل مره بشكل يدوي .
خلاص كذا بس هذا ملخص الفيديو الخاص security بالاضافه الى بعض الحاجات الي اضفته من شان توصل الفكرة بشكل سليم .....
رابط الفيديو للحدث :-
https://youtu.be/7LFftXcw1jA
YouTube
Software supply chain security for Flutter and its ecosystem
Dart and Flutter are investing heavily in tools and services to protect their software supply chain. In this talk we will share our progress improving Flutter’s software supply chain security and the tools created to help the Flutter Ecosystem to improve…
❤13👍12
الكوبون المجاني لكورس Flutter Clean Architecture 👌❤️
وعشان في ناس كتير بتسئل علي الكورس فعملت ليكم المرادي 2000 كوبون مجاني ❤️
متنساش التقييم و الشير ✌️👌
ممكن تقرا التقييمات قبل متدخل الكورس ✌️ واتاكد ان الكورس مناسب ليك
الكوبون المجاني للناس الغير قادرة علي شراء الكورس 👍
http://bit.ly/3WH7Mzk
او اكتب الكوبون FREE_2023_JAN_1
لو خلص خش علي دة
http://bit.ly/401F27f
او اكتب الكوبون FREE_2023_JAN_2
---
ودة كوبون علية خصم كبير جدا حوالي 70% ❤️❤️
http://bit.ly/3R8Q0DT
او اكتب الكوبون BEST_PRICE_2023_JAN
---
ودة كوبون تاني علية خصم كبير جدا 👌
https://bit.ly/3PJucwN
متنساش تقييمك للكورس ولو في اي مشاكل وجهتك تواصل معايا
بلتوفيق للجميع ❤️
وعشان في ناس كتير بتسئل علي الكورس فعملت ليكم المرادي 2000 كوبون مجاني ❤️
متنساش التقييم و الشير ✌️👌
ممكن تقرا التقييمات قبل متدخل الكورس ✌️ واتاكد ان الكورس مناسب ليك
الكوبون المجاني للناس الغير قادرة علي شراء الكورس 👍
http://bit.ly/3WH7Mzk
او اكتب الكوبون FREE_2023_JAN_1
لو خلص خش علي دة
http://bit.ly/401F27f
او اكتب الكوبون FREE_2023_JAN_2
---
ودة كوبون علية خصم كبير جدا حوالي 70% ❤️❤️
http://bit.ly/3R8Q0DT
او اكتب الكوبون BEST_PRICE_2023_JAN
---
ودة كوبون تاني علية خصم كبير جدا 👌
https://bit.ly/3PJucwN
متنساش تقييمك للكورس ولو في اي مشاكل وجهتك تواصل معايا
بلتوفيق للجميع ❤️
Udemy
Flutter Clean Architecture [2022] [Flutter 3] (In Arabic)
هذا الكورس يناقش أفكار ومفاهيم متقدمة في فلاتر لمن يريد زيادة خبرته وتحسين فرصته في سوق العمل
❤9👍5🔥1🥰1
يعني ايه Mounted ؟
Mounted widget
معناه ان widget created و أصبح ليه state
Unmounted widget
معناه ان widget has disposed or closed ومش موجودة وبالتالي انفصلت عن context
طيب ولما اعمل check if the widget is mounted
معناه اني بقول هل state موجودة ولا معدتش موجودة وحصلها disposed ؟
وبالتالي معناه هل state ممكن نعملها update ولا لأ أو نستخدم context بتاعها ولا لأ ؟
مثال لإستخدامها :
مثلا لو عايز اغير رقم بعد ثانية واحدة
Future.delayed(const Duration(seconds: 30), () { setState(() { _currentPage = 5; }); });
وحطيت دا في initState
تخيل لو الصفحة حصلها disposed واتقفلت قبل الثانية ما تخلص هيحصل ايرور
setState() called after dispose()
وبالتالي الحل اننا نستخدم mounted هنا
Future.delayed(const Duration(seconds: 30), () { if (mounted) setState(() => count = 5); });
كدا شرحنا يعني ايه mounted in flutter ومعلومة مهمة mounted متاحة اننا نستخدمها فقط جوا stateful widget مش stateless widget
الجديد بأه ايه ان من أول Flutter 3.7
أصبح ممكن نستخدمهاجو الاتنين stateful widget & stateless widget
#منقول
Mounted widget
معناه ان widget created و أصبح ليه state
Unmounted widget
معناه ان widget has disposed or closed ومش موجودة وبالتالي انفصلت عن context
طيب ولما اعمل check if the widget is mounted
معناه اني بقول هل state موجودة ولا معدتش موجودة وحصلها disposed ؟
وبالتالي معناه هل state ممكن نعملها update ولا لأ أو نستخدم context بتاعها ولا لأ ؟
مثال لإستخدامها :
مثلا لو عايز اغير رقم بعد ثانية واحدة
Future.delayed(const Duration(seconds: 30), () { setState(() { _currentPage = 5; }); });
وحطيت دا في initState
تخيل لو الصفحة حصلها disposed واتقفلت قبل الثانية ما تخلص هيحصل ايرور
setState() called after dispose()
وبالتالي الحل اننا نستخدم mounted هنا
Future.delayed(const Duration(seconds: 30), () { if (mounted) setState(() => count = 5); });
كدا شرحنا يعني ايه mounted in flutter ومعلومة مهمة mounted متاحة اننا نستخدمها فقط جوا stateful widget مش stateless widget
الجديد بأه ايه ان من أول Flutter 3.7
أصبح ممكن نستخدمهاجو الاتنين stateful widget & stateless widget
#منقول
❤22👍8🥰1
تم حل المشكلة لو ظهرت مع حد يتواصل معايا
السلام عليكم
في حد حدث Flutter وظهرت معاه المشكله دي
او حد يعرف حلها
للعلم انا مش مستخدم اي باكدج من اللي ظاهرين في الايرور
السلام عليكم
في حد حدث Flutter وظهرت معاه المشكله دي
او حد يعرف حلها
للعلم انا مش مستخدم اي باكدج من اللي ظاهرين في الايرور
👍5❤3🔥3
من مهندس أنس
مطوري Flutter/Dart! 🎉
أعلن عن إطلاق بيئة تطوير بلغة Dart لاستعمال الذكاء الاصطناعي الخاص بOpenAI، يمكنك الوصول بسهولة وكفاءة إلى جميع الAPIs على OpenAI داخل تطبيق Flutter/Dart، مما يوفر لك الوقت والجهد عند إنشاء مشاريعك الخاصة.
بتصميم API بسيط ومبهج، مما يجعل هذه المكتبة سهلة لدمجها إلى مشاريعك والبدأ في إنشاء حلول ذكية على الفور.
لذلك لماذا تنتظر؟ جرب المكتبة الآن وشاهد الفرق الذي يمكن أن يجعله في عملية تطوير مشاريع الذكاء الاصطناعي الخاص بك.
ولا تنس مشاركة رأيك واقتراحاتكة أنا دائماً أبحث عن طرق للتحسين وتحسين هذا المكتبة بشكل أكبر.
للاستعمال و التحقق, يمكنك زيارة الرابط التالي:
https://pub.dev/packages/dart_openai/
مطوري Flutter/Dart! 🎉
أعلن عن إطلاق بيئة تطوير بلغة Dart لاستعمال الذكاء الاصطناعي الخاص بOpenAI، يمكنك الوصول بسهولة وكفاءة إلى جميع الAPIs على OpenAI داخل تطبيق Flutter/Dart، مما يوفر لك الوقت والجهد عند إنشاء مشاريعك الخاصة.
بتصميم API بسيط ومبهج، مما يجعل هذه المكتبة سهلة لدمجها إلى مشاريعك والبدأ في إنشاء حلول ذكية على الفور.
لذلك لماذا تنتظر؟ جرب المكتبة الآن وشاهد الفرق الذي يمكن أن يجعله في عملية تطوير مشاريع الذكاء الاصطناعي الخاص بك.
ولا تنس مشاركة رأيك واقتراحاتكة أنا دائماً أبحث عن طرق للتحسين وتحسين هذا المكتبة بشكل أكبر.
للاستعمال و التحقق, يمكنك زيارة الرابط التالي:
https://pub.dev/packages/dart_openai/
👍15🔥8❤5😱1