ماهي Hooks ولماذا عليك البدء في استخدامها في مشايعك داخل Flutter

ماهي Hooks ولماذا عليك البدء في استخدامها في مشايعك داخل Flutter

ماهي Hooks ولماذا عليك البدء في استخدامها في مشايعك داخل Flutter

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

والبساطة. في هذه المقالة، سنستكشف الخطافات في Flutter، ونشرح كيفية عملها وسبب أهميتها، وسنقدم أمثلة عملية باستخدام خطافات مثل useMemoized وuseFuture، وكيفية العمل مع التدفقات.


ما هي Flutter Hooks؟

Flutter Hooks هي مكتبة تساعد على تبسيط إدارة حالة التعليمات البرمجية في تطبيقات Flutter. فكرة الخطافات مشابهة لفكرة React، والتي تسمح لك بإدارة الحالة دون الحاجة إلى استخدام StatefulWidget وState مباشرة. يساعد استخدام الخطافات على تحسين تجربة كتابة التعليمات البرمجية عن طريق تقليل تعقيد إدارة الحالات .


لماذا نستخدم Flutter Hooks؟

تبسيط الكود: يساعد استخدام الخطافات على تبسيط إدارة الحالة، وتقليل حجم الكود وجعله أكثر وضوحًا.

إعادة استخدام الكود: يمكنك استخدام نفس الخطافات في عناصر واجهة مستخدم متعددة، مما يعمل على تحسين إعادة استخدام الكود.

أداء أفضل: باستخدام خطافات مثل useMemoized وuseFuture، يمكن تقليل العمليات الباهظة الثمن التي يتم إجراؤها عدة مرات دون داع.


useMemoized

عبارة عن خطاف يستخدم للاحتفاظ بقيم باهظة الثمن تتطلب عملية حسابية طويلة ولا تحتاج إلى إعادة الحساب في كل مرة يتم فيها إعادة إنشاء الأداة. يساعد هذا الخطاف على تحسين العملية من خلال حفظ نتيجة عملية مكلفة وإعادتها دون إعادة مقارنتها.

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';

class ExampleUseMemoized extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final expensiveResult = useMemoized(() {
      // عملية مكلفة مثل جلب البيانات من الإنترنت
      return performExpensiveOperation();
    }, []);

    return Scaffold(
      appBar: AppBar(
        title: Text('useMemoized Example'),
      ),
      body: Center(
        child: Text('Result: $expensiveResult'),
      ),
    );
  }

  String performExpensiveOperation() {
    // محاكاة عملية حسابية معقدة
    return 'Expensive Calculation';
  }
}
useFuture هو خطاف يستخدم لإدارة العقود الآجلة بكفاءة في Flutter. بدلاً من استخدام FutureBuilder، يمكنك استخدام useFuture لكتابة تعليمات برمجية أكثر إيجازًا ووضوحًا.

useFuture

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';

class ExampleUseFuture extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final futureResult = useFuture(fetchData(), initialData: 'Loading...');

    return Scaffold(
      appBar: AppBar(
        title: Text('useFuture Example'),
      ),
      body: Center(
        child: Text('Result: ${futureResult.data}'),
      ),
    );
  }

  Future<String> fetchData() async {
    // محاكاة جلب البيانات
    await Future.delayed(Duration(seconds: 2));
    return 'Data Fetched!';
  }
}
في هذا المثال، يتم استخدام useFuture لانتظار fetchData لجلب البيانات وعرض النتيجة على الشاشة.

useStream

useStream هو خطاف آخر مفيد لإدارة التدفقات في Flutter. بدلاً من استخدام StreamBuilder، يمكنك الاعتماد على useStream لجعل التعليمات البرمجية أكثر وضوحًا وأسهل في القراءة.
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';

class ExampleUseStream extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final streamData = useStream(counterStream(), initialData: 0);

    return Scaffold(
      appBar: AppBar(
        title: Text('useStream Example'),
      ),
      body: Center(
        child: Text('Counter: ${streamData.data}'),
      ),
    );
  }

  Stream<int> counterStream() async* {
    for (int i = 0; i < 10; i++) {
      await Future.delayed(Duration(seconds: 1));
      yield i;
    }
  }
}

البرمجة باستخدام Hooks مقابل البرمجة بدونها

في هذا المثال، باستخدام StatefulWidget وFutureBuilder، نرى أن الكود أطول وأكثر تعقيدًا مقارنة بـ useFuture في المثال السابق. يوضح هذا كيف يمكن للخطافات تبسيط عملية إدارة الحالة ودورة الحياة في Flutter.

import 'package:flutter/material.dart';

class ExampleWithoutHooks extends StatefulWidget {
  @override
  _ExampleWithoutHooksState createState() => _ExampleWithoutHooksState();
}

class _ExampleWithoutHooksState extends State<ExampleWithoutHooks> {
  Future<String> _futureData;
  int _counter = 0;

  @override
  void initState() {
    super.initState();
    _futureData = fetchData();
  }

  Future<String> fetchData() async {
    await Future.delayed(Duration(seconds: 2));
    return 'Data Fetched!';
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Without Hooks Example'),
      ),
      body: Center(
        child: FutureBuilder(
          future: _futureData,
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return CircularProgressIndicator();
            } else {
              return Text('Result: ${snapshot.data}');
            }
          },
        ),
      ),
    );
  }
}

useTextEditingController


useTextEditingController هو خطاف يستخدم لإدارة النص في TextField أو أي عنصر إدخال نص آخر. يعمل هذا الخطاف بشكل مشابه لـ TextEditingController، ولكنه يتناسب بشكل أفضل مع دورة حياة عناصر واجهة المستخدم الخاصة بـ Flutter.
في هذا المثال، يتم استخدام useTextEditingController لإدارة النص في TextField دون الحاجة إلى كتابة الكثير من رموز الحالة التقليدية.
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';

class ExampleUseTextEditingController extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final textController = useTextEditingController();

    return Scaffold(
      appBar: AppBar(
        title: Text('useTextEditingController Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: textController,
              decoration: InputDecoration(labelText: 'Enter Text'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // طباعة النص المدخل في الـ TextField
                print('Text: ${textController.text}');
              },
              child: Text('Print Text'),
            ),
          ],
        ),
      ),
    );
  }
}

useAnimationController

useAnimationController هو خطاف يستخدم لإنشاء الرسوم المتحركة والتحكم فيها في تطبيق Flutter. يمكن استخدامه لتحويل عناصر مثل عناصر واجهة المستخدم بسهولة.
في هذا المثال، تم استخدام useAnimationController لتحريك عنصر الحاوية. تتحكم الرسوم المتحركة في الحجم مع توسع الصندوق تدريجيًا.
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';

class ExampleUseAnimationController extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final animationController = useAnimationController(
      duration: const Duration(seconds: 2),
    );

    // بدء الرسوم المتحركة تلقائيًا عند بدء الـ Widget
    useEffect(() {
      animationController.forward();
      return animationController.dispose;
    }, []);

    return Scaffold(
      appBar: AppBar(
        title: Text('useAnimationController Example'),
      ),
      body: Center(
        child: ScaleTransition(
          scale: animationController,
          child: Container(
            width: 100,
            height: 100,
            color: Colors.blue,
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // إعادة تشغيل الرسوم المتحركة
          animationController.forward(from: 0);
        },
        child: Icon(Icons.play_arrow),
      ),
    );
  }
}
بدون إستخدام Hooks سوف تحتاج لعمل dispose لكل Controller وايضا في حالة initState سوف تحتاج لعملها .

فوائد استخدام الخطافات في فلاتر

تقليل التعقيد: باستخدام الخطافات، يمكنك تقليل التعقيد المرتبط بإدارة الحالة ودورة حياة عنصر واجهة المستخدم.
إعادة استخدام الكود: يمكن بسهولة استخدام الخطافات مثل useMemoized وuseFuture عبر عناصر واجهة مستخدم متعددة.
تحسين الأداء: تجنب عمليات إعادة الحساب غير الضرورية وتجنب العمليات المكلفة.

تُعد Flutter Hooks إضافة قوية إلى نظام Flutter البيئي، مما يساعد على تبسيط إدارة الحالة وكتابة تعليمات برمجية أكثر وضوحًا وتنظيمًا. باستخدام خطافات مثل useMemoized وuseFuture وuseStream، يمكن تحسين أداء التطبيق وتقليل التعقيد. نأمل أن تكون الأمثلة والشروحات قد أعطتك فهمًا أفضل لكيفية استخدام هذه الميزات الرائعة.
تعليقات