ملخص الـ (Null Safety ) بالكامل في فلاتر بالامثلة ( 10 د )

بسم الله، والصلاة والسلام على رسول الله  الحمد لله الذي عَلَّمَ بالقلم.. عَلَّمَ الإنسانَ ما لم يَعْلَم والصلاةُ والسلامُ على خيرِ مُعَلِّمي الناسِ الخير محمد.. الهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت العليم الحكيم .

المقالة هياخد منك 10 دقايق قراءة تقريبا .


الـ null safety من اهم المميزات في dart وبيحللك مشاكل كثير وبيضمنلك امان اكثر في الكود 
ولما تم اضافته في dart تم اضافته الرموز الخاصه بية
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" 
استخدام الكلمة دي لما يكون عندك متغير من اي نوع وليكن مثلا TabController وفي معظم الحالات الكنترولر ده هتديلو قيمتة في الـ initState
اذن هنا حاجتين

1 - ان المتغير ده مش هيبقي nullable لانك متاكد 100% في ال initState هتديلو قيمتة

2- ان المتغير ده مش هتقدر تديلو قيمتة وقت ال declration (وقت كتابة كود المتغير نفسة ) لكن هتديه في المستقبل

وهنا يجي الفايدة من كلمة late لان في حاله تفعيل ال null safety لابد ان المتغير يكون non nullable وياخد قيمة او انه يكون nullable  والحاله الوسط هي ال late 

وحاول دايما قدر المستطاع تتخلي عن الكلمة دي
لان باختصار انت بتقول لل analyzer بتاع dart
اعتبر الكلمة دي non-nullable وانا هحط القيمة بمعرفتي

وبالتالي هو مش هيقدر يساعدك او يحميك لو استخدمت متغير late من غير متحط قيمتة
ساعتها هيديلك الايرور المعروف
LateInitializationError



المشاركات الشائعة من هذه المدونة

اختبار الكود واجمالي نسبة تغطية الاختبارات - unit testing and test coverage in Arabic

تصحيح شكل الكود "linting" والتطبيق مع دارت "dart" 💡

يعني ايه api والتعامل معاها والمصطلحات ومثال بدارت للمبتدئين ( منين بيودي علي فين )