Flutter & Dart ✨️
10.5K subscribers
1.82K photos
134 videos
10 files
298 links
اسألني في اي مشكله ان شاء الله أقدر اساعدك
🎃 @mahmoud_azab99 🎃
Download Telegram
كوبونات مجانيه لدورة Flutter بالعربي علي موقع Udemy ..

اللينك اللي ميشتغلش ادخل علي اللينك التاني لان عددهم محدود 👌🏻❤️

اللينك الأول : https://lnkd.in/dgFEtir6

اللينك الثاني : https://lnkd.in/dRSAVriv

اللينك الثالت : https://lnkd.in/duhK8byK

اللينك الرابع : https://lnkd.in/dd3YTm44
🔥6👍51
اهلا بيكم ياشباب

ده الكورس العربي المتقدم في الفلاتر.

الكورس لا يستهدف التعليم من الصفر بل يستهدف مواضيع متقدمه.

لينك التحميل المجاني لعدد محدود:
https://www.udemy.com/course/flutter-advanced-clean-architecture-with-mvvm-arabic/?couponCode=FREE_JAN

وده لينك اخر بتخفيض كبير:
https://www.udemy.com/course/flutter-advanced-clean-architecture-with-mvvm-arabic/?couponCode=JAN_DIS

الكورس بيعلمك ازاي تعمل مشروع كبير للشركات الكبيرة بشكل احترافي.

الكورس بيحتوي علي الكثير من المواضيع منها:

Clean Architecture Design Pattern
- MVVM - Model - View - View Model Pattern
- Dependency injection
- Application Layer
- Domain layer
- Data layer
- Presentation layer
- State renderer
- Mappers
- Data sources
- Caching
- Localization
7👍2
Prevent Screen Record in Flutter IOS App
دلوقتي لو عايزين نمنع screenshot & screen record في الاندريود
الموضوع بسيط وسهل وناس كتير اتكملت فيه ودا من خلال flutter_windowmanager
اما بالنسبة لل IOS ففي اكتر من طريقة
الطريقة الاولي : ودي من خلال كود نيتف ودا الكود اللي هتحتاجه : http://bit.ly/3WXGMN3
ودي بتمنع الاسكرين شوت والريكورد من التطبيق كله وبتخلي screenshot والفيديو لونهم اسود
ودي ليها عيوب : ١- مش بتقدر تتحكم امتي تمنع وامتي تخلي اليوزر عادي يقدر يعمل screenshot or record
٢- التطبيق بنسبة كبيرة هيترفض في review بتاع ابل لان لو الشخص ال reviewer خد باله انك مانع screen shot or record شكرا خلاص
الطريقة التانية الا وهو نسأل سؤال ليه اصلا عايزين نمنع screenshot or record
ممكن مثلا انا عندي فيديوهات مش عايز اليوز يقدر يسجل الفيديو مثلا
خلاص ايه رأيك نفكر في حاجة تانية الا وهي اننا نحاول نعرف هو بيعمل record ولا لا
يعني نعمل detect للريكورد وبناءا عليه نعمل action زي اننا نقفل التطبيق او نوديه علي سكرينة تانية او اي حاجة حسب السيناريو بتاعك وبكدا نبقي حققنا اللي احنا عايزينه
في بكدج بتعمل كدا فعلا اسمها ios_insecure_screen_detector
ودي بتوفر function بترجع bool هل بيتم التسجيل او لا
;()await _insecureScreenDetector.isCaptured
بس فيها مشكلة انها مش بتوفر stream او listener فهنضر
(تعديل بسيط هنا تقدر بدل stream تعمل timer لو حابب لو شايف ان while مكلفة ) المهم الفكرة واحدة
نعمل احنا stream وهتلاقي طريقة الاستخدام في الكود تحت
فدلوقتي نقدر نمنع screen record في الوقت اللي احنا عايزينه
اما بالنسبة لسكرين شوت هنستخدم بكدج تانية ودي بتوفر ليا function مباشرة للمنع والغاء المنع
اسم البكدج : screen_protector
ملوحظة استخدم الاكواد دي في ios version بتاعة التطبيق بتاعك واستخدم علي الاندريود استخدم flutter_windowmanager
ودا لينك الاكواد اللي في الصور : https://gist.github.com/F-BONAPARTA/1b5161520463b101523b30344aaf03f2
8👍7🔥2
اي واحد مننا في بداية استخدامه لل bloc or provider واجه المشكله دي ProviderNotFoundException, طيب ايه سببها وليه بيحصل وازاي نعالجها، هنعرف دلوقتي.
عندنا في فلاتر في 3 حاجات لازم نعرفهم وهم widget tree, element tree and render object tree ودول ببساطه المسئولين عن تحديد خصائص ومكان ورسم ال widgets علي الشاشه بتاعي

احنا متفقيين ان الشكل بتاع ال trees دي شكل هرمي معتمد علي parent يكون تحتيه child وال child تحتيه child تاني فيكون ال child الاولاني هو ال parent بتاع ال child التاني وهكذا.

طيب هل ال widget بتكون عارفة مكانها فين في ال widget tree ؟
الاجابة هي لاءا، طيب اومال بيتعملها build في المكان اللي حططها فيه ازاي ؟! تعالي اقولك

اما ت create widget، فلاتر بتنادي مثود اسمها createElement و ال element ده بيكون هو مكان ال widget بالظبط .

طيب انا مش بشوف ال element ده خالص .... هو فين اصلا ؟!

المفاجأه انك بتتعامل معاه كتير وانت مش عارف، ال element هو ال context اللي دايما تلاقيه في كل build methods

يعني ال context هو ال position الفعلي لل widget بتاعتي.

فاللي بيحصل انك اما تقول Provider.of(context) او BlocProvider.of(context) في نفس ال Build method اللي عملت فيها provide او inject لل bloc بتاعتك، فلاتر بتبدأ من عند ال context ده وتعمل look up يعني بتبص فوق لل direct parent بتاع ال widget دي فتلاقي انك ماعملتش provide لل bloc في ال parent widget فيقولك ProviderNotFoundException

خليك دايما عارفه ان "of" دايما بتبص علي ال direct parent لل widget وتتدرج لفوق لحد ما تلاقي ال context اللي بتدور عليه.

عشان تعالج المشكله دي في حل بسيط هو انك ت wrap ال widget بتاعتك ب widget تانيه اسمها Builder، ال Builder ده بيديك access لل parent widget في نفس ال method بتاعتك او في نفس ال build method بتاعتك

حل تاني وهو انك تعمل حاجه اسمها standalone widget لل child widget بتاعك يعني انك تعمل لها stateless widget او stateful widget منفصلة وتخليها child لل provider بتاعك.
#منقول
22👍11👏32🤯2🔥1🥰1
------Responsive Flutter-------------
-----------------كما لم تعرفها من قبل--------
الاسئلة الشائعة:
1-كيف اجعل تطبيقي يكون متناسق مع جميع الاجهزه.؟
2-هل يوجد widget واحدة تقوم لي بكل ذلك؟

3-هل الامر صعب؟

الاجوبة---------------
1-اولا : يجب ان تعرف ان الresponsive هو استراتيجية و ليس اداة
كيف يعني🤔🤔
يعني اعتبر نفسك داخل حرب لازم ترسم خطة ان العدو لو هاجمك باي اتجاه ممكن تصده
كذلك المبدا بالresponsivness حيث تعتبر الdevice هي العدو و لازم لو مهما كان حجمها تعرف تصدها😉
لازم تعرف كل شيئ عن عدوك كي تنتصر

انواع الاستراتيجيات:
أ-الاستراتيجيات الدقيقة:
تجيب الHeight و الWidth لكل الشاشات الموجودة في الكون و تعمل Test عليها

كفائتها:. 100%
وقت الانجاز: طويل جدا
محبذة:. في حال كان المشروع ضخم

ب-الاستراتيجيات النسبية:
تجيب الHeight و الWidth ك range من اصغر شاشة و لأكبر شاشة و تقسمهم مجموعات
يعني من شاشة عرضها 0 ل 500 دي مجموعة a
و من شاشة عرضها من 500 ل 700 دي مجموعة b و من 700 ل 900 دي مجموعة c

كفائتها:. 70%
وقت الانجاز: قصير نوعا ما
محبذة: نعم لكن ستواجهك مشاكل في orientation و سيكون حلها صعب بعض الشيئ.

ج-الاستراتيجيات اللحظية:
يعني تحط شرطك قبل اي Widget أن عند الشاشة عرضها أقل من 500 خلي اللون احمر و ازا اكبر من كدا لونها اخضر

كفائتها:. 30%
وقت الانجاز: قصير جدا
محبذة: فقط في الأمور المتعلقة بالالوان و غير محبذة بالامور المتعلقة بالاحجام و المحاذاة.

بعد أن عرفنا الاستراتيجيات يجب اعداد الذخيرة للحرب
أسلحتنا:

1-MediaQuery.of(context).size.width
بتجيب عرض الشاشة و ممكن تحظه ب Function بترجعلك ياه لان انت لو حفظته بمتغير علطول بدون وجوده بأي Widget ستفقد الcontext يلي هو من خلاله انا بعرف انا فين بالwidget tree

طب كيف احفظه بمتغير كي استخدمه لاحقا ؟؟؟🤔🤔 هنا تبدأ الحرب
بعمل ملف اسمه my_media.dart
بعمل فيه class اسمه MyMedia
دا رح احفظ جواه كل أسلحتي يلي ممكن استخدمها و بعمل جواه method بترجعلي عرض الشاشة و الmethod دي من نوع static عشان اقدر استخدمها من دون انشاء عينة من الclass في كل مرة (عشان مش كل مرة اكتب
var myMedia=new MyMedia()
myMedia.getScreenWidth(context);

فيصير بكتب بس
MyMedia.getScreenWidth(context)

طيب خلينا نطبق يلي قلناه
جوا
my_media.dart------بكتب----»

class MyMedia{

static double getScreenWidth(context)=>Media query.of(context).size.width;

static double getScreenHeight(context)=>Media query.of(context).size.height;
}

انا حطيت double بعد الstatic??
لان الmethod دي حترجعلي رقم يلي هو عرض الشاشة و نوعه double و ما زال حترجعلي حاجة فبحط إشارة السهم بعد القوسين
دي
double method()=> X;
و دي
double method(){
return X;
}

نفس الشيئ الاثنين بيرجعولي X من نوع رقم

اذا كيفية قراءة الmethod جوا الclass

-static:اقدر استخدمها دون الحاجة لإنشاء عنصر من الclass
-(double,String,List,Map...):
النوع يلي رح ترجعلي ياه الmethod و في حال كتبت void يعني الMethode مش حترجع حاجة فلا اقدر اخزنها بvariable
مثال
double getNum()=>3.0;
void add(){
1+1;
}
انت لاحظت أن ما كتبتش سهم بالadd دا لان السهم يعني رجعلي دا و انا لو حطيت سهم يعني رجعلي 1+1 يلي يساوي 2 يلي هو رقم
طب انت ازاي ترجعلي رقم و انا قايلك void يعني ما ترجعليش حاجة
بالتالي انا بالadd لا كتبت return و لا حطيت سهم عشان ما يرجعليش حاجة لأنها void

ما زال عرفنا الsyntax بتاع الmethod
نبض شوية على يلي حيرجع منها يلي هو
MediaQuery.of(context).size.width

ركز معايا شوية Query معناها بحث
و اعطيك معلومة عشان تتأكد من كلامي اكتب google.com و اعمل بحث على اي حاجة
بص لفوق حتلاقي مكتوب q=البحث بتاعك
و الQ دي اختصار ل query اتأكدت 😉

Media
معنها كل ما هو محيط بالجهاز
MediaQuery
ابحثلي بكل ما هو محيط بالجهاز

MediaQuery.of(context)
طيب يا سيدي انا ببحثلك لكن انت ما قلتليش
ابحثلك فين في الجهاز ما فيه مليون حتة اعطيني مسار معين ابحث فيه

لكل Widget مسار context
و لولا الcontext ما كنتش الwidget دي تعرف يلي بيحصل بالwidget التانية
و الflutter هو عبارة عن widget tree
كل الwidgets يرجعوا لاصل واحد يلي هو الmain يلي ليها context بتعطيه لكل widget بيورث منها
بالتالي انا لو اخذت اي context موجود بالApplication بتاعي كله حيكون تابع للmain بالتالي انا بس اعطي of(context)
يعني كاني قلتله دا الapplication بتاعي
و بس اقله
MediaQuery.of(context)
يعني دورلي بكل ما هو محيط بالجهاز بمسار الapplication بتاعي
18👍7🥰2🔥1
طيب انت ليه بتعطي الcontext كparameter للmethod 🤔🤔🤔
getScreenWidth(context)=>MediaQuery.of(context)

سبق و قلتلك الcontext يلي انا محتاجه هو المسار بتاع الapp بتاعي يلي موجود بالmain Widget او اي حاجة وارثة منها و انا حاليا جوا class خارجي مش وارث من الmain و اي شي تابع لها لكن بفضل الstatic انا ممكن استخدم الmethod دون انشاء عينة من الclass و ممكن أثناء استخدامها بأي widget اعطيها الcontext بتاع الwidget يلي في النهاية تابع للmain و كدا انا اقدرت استخدم مسار الapplication

طيب نكمل
MediaQuery.of(context).size
دورلي بكل ما هو محيط بالجهاز في مسار الApplication بتاعي على الsize الحجم
و يقصد بها حجم الشاشة
و زي ما انت عارف ان الشاشة ليها طول و عرض
MediaQuery.of(context).size.width
كدا جبت عرض الشاشة
MediaQuery.of(context).size.height
كدا جبت طول الشاشة

static double getScreenWidth(context)=>MediaQuery.of(context).size.width;

هي عملية اقدر استخدمها دون انشاء عينة من الclass و بتاخذ مني مسار يلي هو مسار الapplication بتاعي ك parameter و بترجعلي رقم يلي هو عرض الشاشة
يلي بجيبو من خلال أقول ابحثلي بكل ما يحيط بالجهاز بالمسار يلي انا مدهولك و يلي الapplication بتاعي ابحثلي عن الحجم و جبلي من عرض الشاشة
و نفس الكلام بالنسبة لطول الشاشة

بالنهاية ملف ال my_media.dart
جواه
class MyMedia{
static double getScreenWidth(context)=>MediaQuery.of(context).size.width;

static double getScreenWidth(context)=>MediaQuery.of(context).size.width;
}

طيب انا عايز استخدم الclass دا

بروح على اي Widget
مثلا
Text(
"Hi", style:TextStyle(
color: Colors.red,
)
)

انا عايز عالشاشة يلي عرضها أقل من 700 يكون لون الخط فيها احمر و يلي اكبر من 700 لون الخط يكون فيها أخضر 🤔🤔

Text(
"Hi", style:TextStyle(
color: (MyMedia.getScreenWidth(context))
<700? Colors.red,
: Colors.green
)
)

كدا حيعطيني احمر على الشاشات يلي اصغر من 700 و اخضر على الشاشات يلي اكبر من 700
و كدا منكون ربحنا أول معركة بالحرب يلي هي
الاستراتيجية اللحظية
و ان شاء الله نكمل لاحقا بباقي الاستراتيجيات
اتمنى أن تكونوا استفدتم و لا تنسونا من خالص دعائكم و like share و comment للصفحة كي تعم الفائدة وشكرا لحسن قرائتكم 🤍🤍
#منقول
18👍10👏3🔥2
صباح الخير ..

انا بقالي فتره كبيره بعيد عن كتابة المحتوى الخاص ب 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
#منقول
22👍7🔥4👏3🥰1
How many types of widgets are there in Flutter?
Anonymous Quiz
13%
3
7%
4
42%
+8
38%
2
🤔98🔥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 دي.
#منقول
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
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
#شرح

#منقول
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

#منقول
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
#منقول
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
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
متنساش تقييمك للكورس ولو في اي مشاكل وجهتك تواصل معايا
بلتوفيق للجميع ❤️
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
#منقول
22👍8🥰1
تم حل المشكلة لو ظهرت مع حد يتواصل معايا

السلام عليكم
في حد حدث Flutter وظهرت معاه المشكله دي
او حد يعرف حلها
للعلم انا مش مستخدم اي باكدج من اللي ظاهرين في الايرور
👍53🔥3