شرح كيفية عمل counter بسيط باستخدام Getx state management Flutter

شرح كيفية عمل counter بسيط باستخدام Getx state management Flutter


شرح كيفية عمل counter بسيط باستخدام Getx state management Flutter

موضوع الstate management يعد من اكثر المواضيع المتناوله بشكل كبير جدا في فلاتر تحديدا ولذلك لان بطبيعة عمل الفلاتر انها مبنيه على الwidgets ولهذا نريد ان نقوم بتحديث بعض العناصر في نفس الصفحة لذلك نلجأ الى استخدام الstate management وهي متنوعه بشكل كبير ولكن اشهرها الgetx و bloc و provider وهذه هيا اهم العناصر المتناوله بشكل كبير جدا فيها وفي هذه السلسلة سوف نشرح لكم فكرة عمل الgetx وكيفية التعامل معها بشكل بساطة وهيا تعد من ابسط الطرق التي تساعدك في بناء مشروعك . 


مر وقت كان عليك فيه الاختيار بين إنشاء تطبيقات أصلية وتطبيقات عالمية للأجهزة المحمولة. غالبًا ما تعمل تقنيات الويب مثل HTML و JavaScript ، والتي كانت تستخدمها التطبيقات العالمية ، بشكل سيئ على الأجهزة المحمولة. على الرغم من كونها أكثر تكلفة وتتطلب فريق تطوير متخصصًا لكل منصة ، إلا أن التطبيقات المحلية كانت تعمل بشكل أفضل حيث تم إنشاؤها خصيصًا لكل جهاز ترغب في دعمه.

تم تغيير ذلك بواسطة Flutter ، إطار عمل مفتوح المصدر أنشأته Google. Ionic و React Native و Xamarin ليست سوى عدد قليل من الحلول المتاحة للمطورين اليوم لبناء تطبيقات محمولة سريعة تعمل عبر منصات مختلفة. لا تزال Dart ، لغة البرمجة المدمجة في Flutter ، محبوبة ومستخدمة جيدًا.

بالإضافة إلى تطبيقات Android المكتبية الأولية ، فإن Flutter 3 ، الذي تم تقديمه في وقت سابق من هذا العام ، يدعم أيضًا تطبيقات سطح المكتب لنظامي التشغيل MacOS و Linux.


كيفية استخدام GetBuilder في Flutter

GetBuilder تعد ابسط طريقة للتعامل مع البيانات الخاصه بال GextX وهيا بكل سهوله انك تقوم بعمل GetBuilder للعنصر او حتى للاسكرين بشكل كامل من اجل جعلها تتعامل مع العناصر الخاصه بال Controller الخاص بالGetX ولاحظ انه عليك بان تجعل الinit تكون الcontroller الذي تعمل عليه وهذا يتم لمره واحده فقط واذا لم تكن تريد استخدام الinit يمكنك عمل   var controller = Get.put(MainController()); بداخل الbuild وبهذا يتم تفعيله وتستطيع استخدام وهذا يتم لمره واحده فقط لكي يقوم بتفعيل الكنترول على الصفحه . 


كيفية استخدام GetBuilder في Flutter

screen&controller.dart


// ---------------------------------------- Controller

class MainController extends GetxController {
  
  int count = 0;

  void pulse() {
    count++;
    update();
  }

  void minus() {
    count--;
    update();
  }

}

// --------------------------------- Screen Code
class ScreenOne extends StatelessWidget {
  ScreenOne({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GetBuilder<MainController>(
        init: MainController(),
        builder:(controller)=> Center(
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              TextButton(onPressed: (){
                controller.pulse();
              }, child: Text('+')),
              Spacer(),
              Text('${controller.count}'),
              Spacer(),
              TextButton(onPressed: (){
                controller.minus();
              }, child: Text('-')),
            ],
          ),
        ),
      ),
    );
  }
}


شرح إستخدام GetX في Flutter

GetX تعد نفس فكرة الGetBuilder ولكن الفرق الجوهري بينهم ان الGetx و Obs تعمل على مبدأ الStream بمعنى انها موجوده وتتحدث باستمرار للاستماع الى اي امر جديد قادم لها عكس الGetBuilder التي تنتظر تغيير لكي يتم تحديثها ايضا المتغيرات التي توجد في الGetx لا تحتاج منك الى update فهي تقوم بتحديث نفسها باستمرار لذلك لن تحتاج الى عمل تحديث بداخل الmethode الخاصه بها سوف تحتاج فقط الى ان تقوم بوضع رمز .obs بعد قيمة المتغير في الcontroller وعند الاستدعاء سوف تضع عند المتغير .value وفقط هذا كل ما في الامر .


شرح إستخدام GetX في Flutter

screen&controller2.dart


// ---------------------------------------- Controller

class MainController extends GetxController {
  
  int count = 0.obs;

  void pulse() {
    count++;
  }

  void minus() {
    count--;
  }

}

// --------------------------------- Screen Code
class ScreenOne extends StatelessWidget {
  ScreenOne({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GetX<MainController>(
        init: MainController(),
        builder:(controller)=> Center(
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              TextButton(onPressed: (){
                controller.pulse();
              }, child: Text('+')),
              Spacer(),
              Text('${controller.count.value}'),
              Spacer(),
              TextButton(onPressed: (){
                controller.minus();
              }, child: Text('-')),
            ],
          ),
        ),
      ),
    );
  }
}



شرح إستخدام Obx في Flutter بواسطة Getx

Obx هنا الامر لا يختلف كثيرا عن الGetX نفس المبدأ تقريبا ولكن ما يميز هذا انه لا يحتاج منك الinit للcontroller فقط تستطيع عمل متغير يحمل الcontroller وتقوم بحقنه كما هو موضح امامكم وبعدها تستخدم المتغير في العناصر كما هو موضح .


شرح إستخدام Obx في Flutter بواسطة Getx

screen&controller3.dart


// ----------- controller

class MainController extends GetxController {
  RxInt count = 0.obs;

  void pulse() {
    count++;
  }

  void minus() {
    count--;
  }

}

// ----------------------- screen

class ScreenOne extends StatelessWidget {
  ScreenOne({Key? key}) : super(key: key);

  // initializing
  var controller = Get.put(MainController());

  // find any initializing from project .
  /// var controller2 = Get.find(); ///

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Obx(()=>
          Center(
            child: Row(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                TextButton(onPressed: (){
                  controller.pulse();
                }, child: Text('+')),
                Spacer(),
                Text('${controller.count.value}'),
                Spacer(),
                TextButton(onPressed: (){
                  controller.minus();
                }, child: Text('-')),
              ],
            ),
          ),
      ),
    );
  }
}


ملاحظات :

  • الGetBuilder لا تعمل بمدأ الStream فقط نتظر منك امر معين لكي تقوم بالتحديث على عكس الGext , Obx
  • الObx و الGetX لا تحتاج منك عمل update بداخل الmethode الخاصه بهم لكي تقوم بعمل تحديث للمتغيرات .
  • لا يصلح احاطة عنصر لا يستخدم الcontroller باي طرق من السابقه , مثل زر يقوم بالانتقال الى صفحة اخرى , هذا الزر لا يستخدم اي عناصر من الcontroller لذلك سوف يحدث معك Error .


مزيد من المقالات

  1. حل مشكلة minCompileSdk (31) specified in a dependency's AAR
  2. عمل مؤشر لتتبع الخطوات في فلاتر | flutter stepper
  3.  كود منع تدوير الشاشه في التطبيقات بإستخدام فلاتر
  4.  شرح كيفية عمل post للبيانات من نوع params داخل الapi في flutter
  5. شرح كيفية استخدام الapi مع repostery في Flutter وتنظيم الكود

تعليقات