شرح كيفيه تحويل Widgets إلى صور عالية الجودة باستخدام Flutter

شرح كيفيه تحويل Widgets إلى صور عالية الجودة باستخدام Flutter
كيف تحول أي Widget في تطبيقك إلى صورة عالية الجودة؟


كيف تحول اي Widget إلى صور بضغطة زر في فلاتر

تحويل الـ Widgets إلى صور داخل التطبيقات يعد ميزة قوية يمكن أن تُستخدم في العديد من السيناريوهات، مثل حفظ التذاكر الإلكترونية أو إيصالات الدفع بجودة عالية جاهزة للطباعة. في هذا المقال، سنوضح كيفية تحقيق ذلك باستخدام RepaintBoundary مع خطوات واضحة وأمثلة عملية.


لماذا نحتاج إلى تحويل الـ Widgets إلى صور؟

قبل الغوص في الكود، دعنا نفهم أولاً أهمية هذه الميزة:

  1. حفظ التذاكر والإيصالات : إذا كنت تعمل على تطبيق يعرض تذاكر الحفلات أو إيصالات الدفع، فإن السماح للمستخدم بحفظها كصور عالية الجودة يجعل العملية أكثر احترافية.
  2. تجنب لصور التقليدية : بدلاً من الاعتماد على لقطات الشاشة (Screenshots) التي قد تكون ذات جودة منخفضة، يمكنك تقديم صور مخصصة ومُعدّة بشكل جيد.
  3. الطباعة : الصور عالية الجودة تكون جاهزة للطباعة دون فقدان التفاصيل.


ما هو دور RepaintBoundary؟

RepaintBoundary هو Widget خاص في Flutter يتيح لك عزل جزء معين من واجهة المستخدم ليتم رسمه بشكل مستقل. هذا يجعل من السهل تحويل هذا الجزء إلى صورة باستخدام طريقة toImage().


مكونات RepaintBoundary:

Key : يتم استخدامه للوصول إلى الـ Widget المحدد الذي تريد تحويله إلى صورة.

Child : الـ Widget الفرعي الذي تريد تحويله إلى صورة.


 الخطوات العملية لتحويل الـ Widget إلى صورة

أولاً: إعداد الـ Widget باستخدام RepaintBoundary


RepaintBoundary(
  key: _widgetKey,
  child: YourCustomWidget(),
)

_widgetKey هو Global Key يتم استخدامه لتحديد الـ Widget المراد تحويله.

YourCustomWidget() هو الـ Widget الذي تريد تحويله إلى صورة.


كتابة الدالة لالتقاط وحفظ الصورة

المكتبات المطلوبة:

path_provider : لتحديد مسار تخزين الصور.

open_file : لفتح الصورة بعد حفظها.


dependencies:

  path_provider: ^2.0.11

  open_file: ^3.2.1


الداله المسؤوله عن التحويل


Future<void> _captureAndSave(BuildContext context) async {

  try {

    // الوصول إلى RenderRepaintBoundary باستخدام الـ Key
    RenderRepaintBoundary boundary = _widgetKey.currentContext!
        .findRenderObject() as RenderRepaintBoundary;

    // تحويل الـ Widget إلى صورة
    ui.Image image = await boundary.toImage(pixelRatio: 10.0);
    ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png);

    // تحويل البيانات إلى Uint8List
    Uint8List pngBytes = byteData!.buffer.asUint8List();

    // تحديد مسار الحفظ
    final directory = (await getApplicationDocumentsDirectory()).path;
    final file = File('$directory/IMG-${DateTime.now().millisecondsSinceEpoch}.png');
    await file.writeAsBytes(pngBytes);

    // فتح الصورة المخزنة
    await OpenFile.open(file.path);
  } catch (e) {
    throw Exception(e);
  }
}

كيف تستفيد من هذه الميزة؟

أ) تطبيقات الحجز والتذاكر

إذا كنت تعمل على تطبيق لحجز التذاكر (مثل تذاكر الطيران أو الحفلات)، يمكنك استخدام هذه الميزة لجعل المستخدمين يحفظون التذاكر بصيغة صور عالية الجودة، مما يسهل عليهم الطباعة أو عرضها عند الحاجة.

ب) إيصالات الدفع

عند إنشاء إيصالات الدفع، يمكنك توفير زر "حفظ الإيصال" يتيح للمستخدمين تنزيل الإيصال كصورة بدلاً من الاعتماد على لقطات الشاشة.

ج) تصدير المحتوى

يمكن استخدام هذه الميزة لتصدير أي محتوى مرئي من التطبيق، مثل الرسوم البيانية أو التقارير.


 هل يمكنني تحسين جودة الصورة الناتجة؟

نعم، يمكنك تحسين جودة الصورة عن طريق زيادة قيمة pixelRatio في الدالة toImage(). كلما زادت القيمة، كانت الصورة أكثر وضوحًا.


هل يمكنني حفظ الصورة في مكان آخر غير مجلد التطبيق؟

نعم، يمكنك استخدام مكتبة مثل permission_handler للحصول على إذن الوصول إلى التخزين الخارجي وحفظ الصورة في أي مكان تريده.


ماذا لو كان الـ Widget كبيرًا جدًا؟

إذا كان الـ Widget كبيرًا جدًا، قد تحتاج إلى تقسيمه إلى أجزاء أصغر أو استخدام تقنيات أخرى مثل التمرير التلقائي أثناء التقاط الصورة.


تحويل الـ Widgets إلى صور عالية الجودة باستخدام RepaintBoundary هو ميزة قوية يمكن أن تُستخدم في العديد من التطبيقات. سواء كنت تعمل على تطبيق لإدارة التذاكر، إيصالات الدفع، أو حتى تصدير المحتوى، فإن هذه التقنية توفر تجربة مستخدم أفضل وتزيد من احترافية تطبيقك.


إذا كنت تبحث عن طريقة سهلة لتحسين تطبيقك وإضافة ميزات جديدة، فلا تتردد في تجربة هذه الطريقة!

تعليقات