شارك المقالة
صفحة بطاقات الائتمان في Flutter, Flutter Credit Cards Page, Flutter Wallet App, تصميم Wallet Flutter, Hero Animation Flutter, Flutter Credit Card UI

كيفية بناء صفحة بطاقات الائتمان في Flutter | تصميم Credit Cards Page في تطبيق Wallet

شرح بناء صفحة بطاقات الائتمان في تطبيق Flutter (Credit Cards Page) بالتفصيل


تُعد صفحة بطاقات الائتمان من أهم مكونات تطبيقات المحافظ الرقمية، حيث تتيح للمستخدم استعراض بطاقاته، التنقل بينها، وإدارتها بطريقة تفاعلية وسلسة. في هذه المقالة نشرح كيفية إنشاء صفحة بطاقات ائتمان احترافية داخل تطبيق Wallet باستخدام Flutter، مع دعم الأنيميشن والسحب (Drag) وتأثيرات الانتقال المتقدمة.

ما هي صفحة بطاقات الائتمان في تطبيق المحفظة؟

صفحة بطاقات الائتمان هي واجهة تعرض بطاقات المستخدم في شكل تكديسي (Stacked Cards)، مع إمكانية: – السحب لتغيير البطاقة – الضغط لفتح تفاصيل البطاقة – تنفيذ أنيميشن انتقال احترافي باستخدام Hero – إضافة بطاقة جديدة لاحقًا
يتم تنفيذ ذلك باستخدام StatefulWidget و AnimationController و GestureDetector.

إعداد المشروع

بعد تثبيت Flutter، يمكن إنشاء مشروع جديد عبر:

flutter create wallet_app

ثم إنشاء ملف:
lib/credit-cards/credit_cards_page.dart

هيكل صفحة CreditCardsPage

تعتمد الصفحة على: – StatefulWidget لإدارة حالة البطاقة النشطة – Stack لعرض البطاقات فوق بعضها – Hero Animation للانتقال بين الصفحات – GestureDetector لدعم السحب

الكود الكامل لصفحة بطاقات الائتمان


class CreditCardsPage extends StatefulWidget {
  const CreditCardsPage({
    super.key,
    this.onCardPagePush,
    this.onCardPagePop,
  });

  final VoidCallback? onCardPagePush;
  final VoidCallback? onCardPagePop;

  @override
  State<CreditCardsPage> createState() => _CreditCardsPageState();
}

class _CreditCardsPageState extends State<CreditCardsPage> {
  int activeCard = 0;

  @override
  Widget build(BuildContext context) {
    final screenSize = MediaQuery.of(context).size;
    final cardHeight = screenSize.width * 0.75;
    final cardWidth = cardHeight * 1.6;

    return Center(
      child: SizedBox(
        width: cardHeight,
        height: cardWidth,
        child: CreditCardsStack(
          itemCount: 3,
          initialActiveCard: activeCard,
          onCardTap: (index) {
            Navigator.of(context).push(
              PageRouteBuilder(
                transitionDuration: const Duration(milliseconds: 800),
                pageBuilder: (_, animation, __) {
                  return FadeTransition(
                    opacity: animation,
                    child: Scaffold(
                      appBar: AppBar(title: const Text("Card Details")),
                      body: Center(child: Text("Card Index: $index")),
                    ),
                  );
                },
              ),
            );
          },
          itemBuilder: (context, index) {
            return Transform.rotate(
              angle: -0.5,
              child: Container(
                width: cardWidth,
                height: cardHeight,
                decoration: BoxDecoration(
                  color: Colors.deepPurple,
                  borderRadius: BorderRadius.circular(20),
                ),
                child: Center(
                  child: Text(
                    "Card ${index + 1}",
                    style: const TextStyle(
                      color: Colors.white,
                      fontSize: 22,
                    ),
                  ),
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}

تنفيذ Stack تفاعلي للبطاقات


class CreditCardsStack extends StatefulWidget {
  const CreditCardsStack({
    required this.itemCount,
    required this.itemBuilder,
    this.onCardTap,
    this.initialActiveCard = 0,
    super.key,
  });

  final int itemCount;
  final Widget Function(BuildContext, int) itemBuilder;
  final ValueChanged<int>? onCardTap;
  final int initialActiveCard;

  @override
  State<CreditCardsStack> createState() => _CreditCardsStackState();
}

class _CreditCardsStackState extends State<CreditCardsStack>
    with SingleTickerProviderStateMixin {

  late AnimationController _controller;
  Offset dragOffset = Offset.zero;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 200),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: List.generate(widget.itemCount, (index) {
        return Positioned(
          top: index * 10,
          left: 0,
          right: 0,
          child: GestureDetector(
            onTap: () => widget.onCardTap?.call(index),
            onPanUpdate: (details) {
              setState(() {
                dragOffset += details.delta;
              });
            },
            onPanEnd: (_) {
              setState(() {
                dragOffset = Offset.zero;
              });
            },
            child: Transform.translate(
              offset: index == widget.itemCount - 1
                  ? dragOffset
                  : Offset.zero,
              child: widget.itemBuilder(context, index),
            ),
          ),
        );
      }),
    );
  }
}

مميزات هذا الأسلوب

المميزات. – تجربة مستخدم تفاعلية بالسحب – دعم Hero Animation للانتقال الاحترافي – تصميم عصري مناسب لتطبيقات Wallet – قابلية توسعة لإضافة حذف أو إضافة بطاقة

العيوب. – يتطلب فهم جيد للأنيميشن – يحتاج اختبار دقيق للأداء – إدارة الحالة قد تصبح معقدة في المشاريع الكبيرة

توسيع التطبيق مستقبلاً

يمكنك إضافة: – شاشة إضافة بطاقة جديدة – حفظ البيانات باستخدام Provider أو Bloc – تشفير بيانات البطاقة – دعم Dark Mode
إن تنفيذ صفحة بطاقات الائتمان بهذه الطريقة يمنح تطبيقك مظهرًا احترافيًا يشبه تطبيقات البنوك الحقيقية. باستخدام Flutter يمكنك إنشاء واجهات مالية متقدمة مع أنيميشن سلسة وتجربة مستخدم ممتازة.

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

الكود المصدر:

المشروع الكامل:
شاهد أيضًا
مقالات ذات صلة
شرح كيفية رفع المشروع Project اندرويد ستوديو الخاص بك على منصة Github

يعتبر تطوير تطبيقات واحد من اكثر الوظايف التي لديها اقبال كبير من اكثر من شركة…

كيفية حذف بيانات من Database بإستخدام Flutter عن طريق السحب

  كيفية حذف بيانات من Database بإستخدام Flutter عن طريق السحبفي هذا المقال سوف نتعرف…

التعامل مع التصميم في حالة portrait و landscape باستخدام mediaQuery في Flutter

  التعامل مع التصميم في حالة portrait و landscape باستخدام mediaQuery في Flutterفي هذا الدرس…

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

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