شارك المقالة

شرح Flutter AnimatedContainer UI لإنشاء واجهات تفاعلية احترافية في Flutter


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

في هذا المقال سنشرح الكود المقدم بشكل عملي ومفصل، وسنوضح كيف يمكنك استخدام عناصر مثل AnimatedContainer و Switch و TweenAnimationBuilder لإنشاء واجهات ديناميكية قابلة للتخصيص، مع تحسين تجربة المستخدم داخل التطبيق.

ما هو Flutter ولماذا يستخدم في بناء واجهات مرنة؟

Flutter هو إطار عمل مفتوح المصدر من Google يتيح للمطورين بناء تطبيقات عالية الجودة تعمل على Android و iOS والويب وسطح المكتب من خلال قاعدة كود واحدة. ويتميز Flutter بسرعته الكبيرة في التطوير وقدرته على تقديم واجهات سلسة وحديثة.

تكمن قوة Flutter في أنه يمنحك تحكمًا مباشرًا في تفاصيل الواجهة، وهذا ما يجعله مناسبًا جدًا عند تنفيذ Flutter AnimatedContainer UI أو أي تجربة تفاعلية تعتمد على الحركة وتبديل الحالات بشكل ديناميكي.

نظرة على المكتبات المستخدمة في الكود

في بداية الكود تم استيراد مجموعة من المكتبات الأساسية:

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_openui/utils/colors.dart';
import 'package:flutter_openui/utils/sizing.dart';
هذه التبعيات تلعب دورًا مهمًا في بناء الواجهة:

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

material.dart
توفر عناصر Flutter الأساسية مثل Scaffold و Switch و Icon و AnimatedContainer وغيرها من مكونات التصميم.

colors.dart و sizing.dart
تساعد في تنظيم الألوان والمقاسات داخل المشروع، مما يجعل الكود أكثر ترتيبًا وقابلية لإعادة الاستخدام.

فهم StatefulWidget في هذا المثال

تم إنشاء الشاشة الرئيسية باستخدام StatefulWidget لأن الواجهة تعتمد على تحديث الحالة بشكل مستمر عند تفاعل المستخدم مع العناصر.

class HomeScreen extends StatefulWidget {
  const HomeScreen({super.key});

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}
استخدام StatefulWidget هنا ضروري لأن هناك عدة متغيرات تتغير أثناء الاستخدام مثل:

isExpanded
تحدد ما إذا كانت الحاوية موسعة أو مطوية.

hasCopied و hasCopied2
يتم استخدامهما للتحكم في الأيقونة المتحركة وتغيير حالتها بعد النقر.

activeIndex
يحدد العنصر النشط داخل الشبكة التفاعلية.

دور AnimatedContainer في بناء Flutter AnimatedContainer UI

يعتبر AnimatedContainer من أهم العناصر في Flutter عندما تريد إنشاء انتقالات مرئية سلسة بين حالتين مختلفتين دون الحاجة إلى كتابة AnimationController معقد.

AnimatedContainer(
  onEnd: () {
    setState(() => hasCopied = true);
  },
  duration: Duration(milliseconds: 2500),
  curve: Curves.elasticOut,
  decoration: BoxDecoration(
    color: AppColors.textWhite,
    borderRadius: BorderRadius.circular(15),
  ),
)
في هذا المثال، يتم تغيير حجم الحاوية وخصائصها مع حركة مرنة جدًا باستخدام Curves.elasticOut. وهذا يضيف طابعًا احترافيًا للواجهة ويجعل التفاعل أكثر حيوية بالنسبة للمستخدم.

الميزة الكبيرة في AnimatedContainer أنه يختصر الكثير من الجهد، إذ يكفي تغيير القيم داخل setState ليقوم Flutter بتحريك العنصر تلقائيًا.

استخدام Switch للتحكم في تمدد الواجهة

من أهم عناصر التفاعل في هذا الكود هو Switch، حيث يسمح للمستخدم بتوسيع المحتوى أو إغلاقه بسهولة.

Switch(
  value: isExpanded,
  onChanged: (val) {
    setState(() {
      isExpanded = !isExpanded;
      activeIndex = null;
    });
  },
)
عند تغيير الحالة، يتم تحديث قيمة isExpanded، وبالتالي يتغير ارتفاع AnimatedContainer تلقائيًا. هذا الأسلوب يمنح المستخدم تحكمًا مباشرًا في شكل الواجهة، ويجعل تجربة الاستخدام أكثر تفاعلية ومرونة.

تنظيم العناصر باستخدام Stack و Column

يعتمد الكود أيضًا على Stack و Column و Row لترتيب العناصر بشكل ذكي.

Stack(
  alignment: Alignment.center,
  children: [
    Column(
      children: [
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            CartItem(...),
            CartItem(...),
          ],
        ),
        SizedBox(height: 10),
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            CartItem(...),
            CartItem(...),
          ],
        ),
      ],
    ),
    TweenAnimationBuilder(...)
  ],
)
يسمح Stack بوضع عنصر متحرك في المنتصف فوق بقية العناصر، بينما يتم استخدام Column و Row لبناء شبكة منظمة من البطاقات التفاعلية. هذا الأسلوب مفيد جدًا عند تصميم واجهات حديثة تحتوي على أزرار متداخلة أو عناصر متحركة في منتصف الشاشة.

استخدام TweenAnimationBuilder لإضافة حركة ناعمة

عنصر TweenAnimationBuilder تم استخدامه لإضافة تأثير تكبير وتصغير للأيقونة المركزية:

TweenAnimationBuilder(
  key: ValueKey(hasCopied),
  curve: Curves.elasticOut,
  tween: Tween<double>(begin: hasCopied ? 1.0 : 1.2, end: hasCopied ? 1.2 : 1.0),
  duration: const Duration(milliseconds: 500),
  builder: (context, value, child) {
    return Transform.scale(
      scale: value,
      child: child,
    );
  },
)
هذا الجزء مهم جدًا في تحسين Flutter AnimatedContainer UI لأنه يضيف استجابة بصرية مباشرة عند الضغط. عندما يرى المستخدم أن العنصر يتحرك ويتغير شكله، فإنه يشعر بأن التطبيق أكثر احترافية وذكاءً.

شرح CartItem كعنصر تفاعلي مستقل

تم تعريف CartItem كعنصر مستقل لإعادة استخدامه أكثر من مرة داخل الواجهة:

class CartItem extends StatelessWidget {
  final bool isExpanded;
  final Function()? onTap;
  final bool isActive;

  const CartItem({
    super.key,
    required this.isExpanded,
    required this.onTap,
    required this.isActive,
  });
}
ميزة هذا الأسلوب أنه يجعل الكود أكثر تنظيمًا وقابلية للصيانة. بدلًا من تكرار نفس التصميم عدة مرات، يمكن إنشاء Widget مخصص يحتوي على كل السلوك المطلوب ثم استخدامه عند الحاجة.

كما أن CartItem يعتمد على AnimatedContainer أيضًا لتغيير اللون والخلفية حسب حالة العنصر:

AnimatedContainer(
  duration: duration,
  height: AppSizing.height(context) * 0.09,
  width: AppSizing.width(context) * 0.36,
  decoration: BoxDecoration(
    color: isActive
        ? Colors.blue.withOpacity(0.2)
        : !isExpanded
            ? AppColors.textWhite
            : AppColors.bgGrey,
    borderRadius: BorderRadius.circular(8),
  ),
)
عندما يصبح العنصر نشطًا، يتغير لونه، وعندما تكون الواجهة غير موسعة أو موسعة يتغير مظهره تلقائيًا. وهذا يعطي إحساسًا واضحًا بالحالة الحالية لكل عنصر.

كيف يحسن هذا الكود تجربة المستخدم؟

الكود لا يركز فقط على الشكل، بل يهدف بوضوح إلى تحسين تجربة المستخدم من خلال عدة نقاط مهمة:

التفاعل السلس
استخدام AnimatedContainer و TweenAnimationBuilder يمنح المستخدم تجربة ناعمة بدلًا من الانتقال الفجائي بين الحالات.

الوضوح البصري
العناصر النشطة تظهر بشكل مختلف، مما يسهل على المستخدم فهم حالته الحالية داخل الواجهة.

إمكانية التخصيص
وجود Switch والعناصر القابلة للنقر يمنح المستخدم حرية أكبر في التفاعل مع المحتوى.

تنظيم جيد للكود
تقسيم الواجهة إلى عناصر مستقلة مثل CartItem يساعد المطور على التعديل المستقبلي بسهولة.

أفضل استخدامات هذا الأسلوب في مشاريع Flutter

يمكن تطبيق Flutter AnimatedContainer UI في الكثير من المشاريع العملية مثل:

– تطبيقات التجارة الإلكترونية – واجهات الإعدادات التفاعلية – لوحات التحكم Dashboard – تطبيقات الإنتاجية وإدارة المهام – تطبيقات تعليمية تحتاج إلى بطاقات تفاعلية – أدوات التحكم السريعة داخل التطبيقات الحديثة

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

رابط الكود الكامل على GitHub

يمكنك مراجعة الكود الأصلي من خلال الرابط التالي:

https://github.com/yunweneric/flutter-open-ui/tree/rounded_corners_interaction/lib/screens
هذا الرابط مفيد إذا كنت تريد تجربة الكود بنفسك أو التوسع في فهم طريقة تنفيذ الواجهة وتطويرها بما يناسب مشروعك.

الخلاصة

يعد أسلوب Flutter AnimatedContainer UI من أفضل الأساليب لبناء واجهات تفاعلية واحترافية داخل Flutter، لأنه يجمع بين سهولة التنفيذ والمظهر العصري وتجربة المستخدم الممتازة.

من خلال الاعتماد على AnimatedContainer و Switch و Stack و TweenAnimationBuilder، يمكنك إنشاء واجهات مرنة تستجيب مباشرة لتفاعل المستخدم، دون الحاجة إلى كتابة أكواد Animation معقدة.

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

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

🚫 مانع الإعلانات مفعل

يجب إيقاف مانع الإعلانات لاستكمال تصفح الموقع