ملخص الـ (Null Safety ) بالكامل في فلاتر بالامثلة ( 10 د )
بسم الله، والصلاة والسلام على رسول الله الحمد لله الذي عَلَّمَ بالقلم.. عَلَّمَ الإنسانَ ما لم يَعْلَم والصلاةُ والسلامُ على خيرِ مُعَلِّمي الناسِ الخير محمد.. الهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت العليم الحكيم .
المقالة هياخد منك 10 دقايق قراءة تقريبا .
operators ! , ? , ??= , ?? , *
- " ! "
- وقبله انت ليه محتاجه ؟
المتغيرات في dart بقت null able - قابل ان قيمتة تساول null
non-nullable - لا يقبل ال null ابدا وبالتالي انا لو بحاول احط قيمته حاجه من النوع الاول للنوع الثاني ال analyzer وانا بكت الكود هيظهرلي الخطا الي في الصورة انه مش قادر يحط nullable في non nullable
- وحل المشكلة هو استخدام علامه التعجب دي " ! " ( الطريقه الخطر ) ومعناها ان انا متاكد ان ال المتغير الاول ( nullable ) قيمته حاليا مش ب null وبجبرك تحط قيمته في المتفير الي من نوع non-nullable
وده من اخطر الامور الي لازم تكون متاكد منها قبل استخدمها بنسبة 100% لانك لو اجبرته علي كدا وطلعت قميته المتغير ب null
ده هيبسبب اكسبشن في ال run time ( والكود شغال )
وعلشان تتلافي الخطا ده ( الطريقه الامنة ) اما تستخدم if else علشان تتاكد ان القيمه مش null
- اما تستخدم الـ operator الثاني وهو " ؟ "
- رمز " ? "
- الرمز ده هتستخدمه مع المتغيرات ال nullable بس غير كدا ملهوش لازمه
- المشكله الي بتحلها علامه الاستفاهم دي ؟
لو عندك متغير ممكن يكون ب null وليكن مثلا User وعاوز تجيب اسم اليوزر ده او اي قيمه جواه age ,address , email الخ لازم تتاكد انه الاول مش null علشان تستخدم القيمه الي جواه لان مش من الطبيعي تستخدم حاجه وهي ب null اساسا
- فالطريقه الاولي دلوقتي انك تعمل زي اخر مثال في الصورة وتعمل if else بطريقه فلاتر ال declarative علشان نستخدم دي في الكود مش هتبقي كويسه ( من ناحية شكل الكود فقط ملهاش تاثير علي السرعه )
- وهنا يجي دور ال " ? "
هتخليك تستخدم متغير nullable وتستخدم خاصية من جواه (property)وتختلف النتيجة حسب قيمه المتغير نفسه يعني اعتبرها اختصار في الكود واسهل للقرائة
مثال :
لو في متفير نوعه User وجواه خصائص اليوزر نفسه ( الاسم كامل و العمر و العنوان ... الخ ) الحجات دي كلها جوا المتغير بتاع اليوزر ومنقدرش نوصلها الا لو كان معانا اوبجكت من User وليس فقط متغير قيمته nullلو عملنا مستخدم جديد وادنالو اسم ahmed
User ahmed = User();
الاول الاوبجكت او المتغير الاساسي الي هو ahmed
والثاني متغير جوا احمد وهو name
لو استخدمنا معاهم " ؟ "
زي المثال الي في نصف الصورة
لو المتغير الاساسي(user) قيمته == null يبقي الناتج هيكون null
لو المتغير الاساسي (user) قيمته مش null يبقي الناتج هيكون قيمه اسم اليوزر (user.name)
- `=??`
ده مجرد اختصار للطريقه الاولي الي في الصورة
ودورة تعيين قيمه للمتغير في حاله ان فيمه المتغير == null
ولو مش null متحطش القيمة دي
- "؟؟"
الرمز ده بيوفر عليك انك تعمل return لقيمه افتراضية في حاله ان المتغير الاساسي ب null
- مثلا اخر مره اليوزر يفتح فيها التطبيق
هنقول الـ last login اول مره طبيعي تبقي null
ولو عاوزين نعمل سلوك انها دايما ترجع تاريخ حتي لو كان المستخدم اول مره يفتح التطبيق
(اخر تسجيل دخول هيبقي تاريخ الوقت ده)
هتبقي
return lastDate ?? DateTime.now();
رجع قيمه اخر تسجيل دخول ولو مفيش قيمة سابقة لاخر تسجيل دخول رجع التاريخ الحالي .
- "late"
اذن هنا حاجتين
1 - ان المتغير ده مش هيبقي nullable لانك متاكد 100% في ال initState هتديلو قيمتة
2- ان المتغير ده مش هتقدر تديلو قيمتة وقت ال declration (وقت كتابة كود المتغير نفسة ) لكن هتديه في المستقبل
وهنا يجي الفايدة من كلمة late لان في حاله تفعيل ال null safety لابد ان المتغير يكون non nullable وياخد قيمة او انه يكون nullable والحاله الوسط هي ال late
وحاول دايما قدر المستطاع تتخلي عن الكلمة دي
وحاول دايما قدر المستطاع تتخلي عن الكلمة دي
لان باختصار انت بتقول لل analyzer بتاع dart
اعتبر الكلمة دي non-nullable وانا هحط القيمة بمعرفتي
وبالتالي هو مش هيقدر يساعدك او يحميك لو استخدمت متغير late من غير متحط قيمتة
ساعتها هيديلك الايرور المعروف
LateInitializationError