پروژه مینی سبد خرید

تعداد بازدید ها : 1,084 بازدید
 پروژه مینی سبد خرید

در این پروژه شما با ویجت های StateLess و StateFull و نحوه پاس داده مقادیر به هر کدام و نحوه استفاده از مجموعه های List و Set و مباحث شی گرایی و نحوه استفاده از ویجت های پایه فلاتر مثل Scaffold , ListView , ListTile , Card و CircleAvatar آشنا می شوید . خروجی این پروژه به شکل زیر است که با کلیک بر روی هر سطر ، آن سطر انتخاب شده ( رنگ متن و دایره آبی رنگ تغییر می کند ) و با کلیک بر روی آیکون سمت راست هر سطر ، عبارتی در خروجی پرینتر می شود .

پروژه مینی سبد خریددر این مثال ما به سرور متصل نشده ایم و لیست محصولات را به صورت دستی ایجاد کرده ایم . کد این پروژه به این شکل است :

  1. import 'package:flutter/material.dart';
  2. void main() => runApp(MyApp());
  3. // کلاس پایه که در شروع برنامه فراخونی می شود
  4. class MyApp extends StatelessWidget {
  5. @override
  6. Widget build(BuildContext context) {
  7. // ویجت متریال اپ
  8. return MaterialApp(
  9. debugShowCheckedModeBanner: false,
  10. title: 'Shopping App',
  11. // فراخوانی تابع لیست محصولات و ارسال مقادیر به آن
  12. // در این پروژه به سرور متصل نشدیم و مقادیر لیست به صورت دستی ایجاد شده است
  13. home: ShoppingList(products: <Product>[
  14. new Product(name: 'Appel'),
  15. new Product(name: 'Microsoft'),
  16. new Product(name: 'Google'),
  17. new Product(name: 'IBM'),
  18. new Product(name: 'Micromadia'),
  19. new Product(name: 'Adobe'),
  20. new Product(name: 'Sony'),
  21. new Product(name: 'Appel'),
  22. new Product(name: 'Microsoft'),
  23. new Product(name: 'Google'),
  24. new Product(name: 'IBM'),
  25. new Product(name: 'Micromadia'),
  26. new Product(name: 'Adobe'),
  27. new Product(name: 'Sony'),
  28. new Product(name: 'Appel'),
  29. new Product(name: 'Microsoft'),
  30. new Product(name: 'Google'),
  31. new Product(name: 'IBM'),
  32. new Product(name: 'Micromadia'),
  33. new Product(name: 'Adobe'),
  34. new Product(name: 'Sony'),
  35. ]),
  36. );
  37. }
  38. }
  39. // کلاس سازنده یک محصول
  40. // محصول ما در این مثال فقط شامل نام است
  41. class Product {
  42. final String name;
  43. Product({this.name});
  44. }
  45. // تعریف یک تایپ جهت استفاده در ادامه کد
  46. typedef void CartChangedCallBack(Product product, bool inCart);
  47. // کلاس لیست محصولات
  48. class ShoppingList extends StatefulWidget {
  49. // مجموعه ای از محصولات
  50. final List<Product> products;
  51. // سازنده کلاس که در ورودی مجموعه ای از محصولات را دریافت می کند
  52. ShoppingList({this.products});
  53. @override
  54. _ShoppingListState createState() => _ShoppingListState();
  55. }
  56. // کلاس استیت مربوط به لیست محصولات
  57. class _ShoppingListState extends State<ShoppingList> {
  58. // مجموعه ای از محصولات که در حالت انتخاب قرار گرفته اند
  59. // این مجموعه در واقع سبد خرید ما را شکل داده است
  60. Set<Product> ShopingCart = Set<Product>();
  61. // تابع مدیریت سبد خرید
  62. // در ورودی یک محصول را دریافت و در صورتی که وجود داشته باشد حذف و در غیر اینصورت اضافه می کند
  63. void handelCartChanged(Product product, bool inCart) {
  64. setState(() {
  65. if (inCart) {
  66. // حذف یک محصول
  67. ShopingCart.remove(product);
  68. } else {
  69. // درج یک محصول
  70. ShopingCart.add(product);
  71. }
  72. });
  73. }
  74. @override
  75. Widget build(BuildContext context) {
  76. return Scaffold(
  77. appBar: AppBar(
  78. title: Text('My App'),
  79. ),
  80. body: ListView(
  81. padding: const EdgeInsets.all(5.0),
  82. // توسط تابع مپ بر روی لیست محصولات حرکت کرده و ویجت هر سطر ساخته می شود
  83. // توسط دستور widget می توانید به متغییرهای کلاس StateFull دسترسی داشته باشید
  84. children: widget.products.map((Product product) {
  85. // فراخوانی تابع سازنده هر سطر از محصول
  86. return ShoppingListItem(
  87. product: product,
  88. onCartChange: handelCartChanged,
  89. // اگر محصول در سبد خرید وجود داشته باشد مقدار True را پاس می دهد
  90. inCart: ShopingCart.contains(product),
  91. );
  92. }).toList(),
  93. ),
  94. );
  95. }
  96. }
  97. // تابع سازنده هر سطر از محصول
  98. class ShoppingListItem extends StatelessWidget {
  99. final Product product; // آبجکت محصول
  100. final CartChangedCallBack onCartChange; // تابع مدیریت سبد خرید
  101. final bool inCart; // متغییر وضعیت انتخاب محصول
  102. // سازنده کلاس با سه ورودی
  103. ShoppingListItem({this.product, this.onCartChange, this.inCart});
  104. // تابع مدیریت رنگ پس زمینه بر اساس وضعیت انتخاب محصول
  105. Color getColorBackground(BuildContext context) {
  106. return inCart ? Colors.green : Theme.of(context).primaryColor;
  107. }
  108. // تابع مدیریت رنگ متن بر اساس وضعیت انتخاب محصول
  109. Color getColorText(BuildContext context) {
  110. return inCart ? Colors.red : Colors.black;
  111. }
  112. @override
  113. Widget build(BuildContext context) {
  114. return Card(
  115. child: ListTile(
  116. onTap: () {
  117. // فراخوانی تابع مدیریت سبد خرید
  118. onCartChange(product, inCart);
  119. },
  120. leading: CircleAvatar(
  121. backgroundColor: getColorBackground(context),
  122. child: Text(product.name[0]),
  123. ),
  124. title: Text(
  125. product.name,
  126. style: TextStyle(color: getColorText(context)),
  127. ),
  128. trailing: IconButton(
  129. onPressed: () {
  130. print('more: ${product.name}');
  131. },
  132. icon: Icon(Icons.more_vert),
  133. ),
  134. ),
  135. );
  136. }
  137. }
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

// کلاس پایه که در شروع برنامه فراخونی می شود
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // ویجت متریال اپ
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Shopping App',
      // فراخوانی تابع لیست محصولات و ارسال مقادیر به آن
      // در این پروژه به سرور متصل نشدیم و مقادیر لیست به صورت دستی ایجاد شده است
      home: ShoppingList(products: <Product>[
        new Product(name: 'Appel'),
        new Product(name: 'Microsoft'),
        new Product(name: 'Google'),
        new Product(name: 'IBM'),
        new Product(name: 'Micromadia'),
        new Product(name: 'Adobe'),
        new Product(name: 'Sony'),
        new Product(name: 'Appel'),
        new Product(name: 'Microsoft'),
        new Product(name: 'Google'),
        new Product(name: 'IBM'),
        new Product(name: 'Micromadia'),
        new Product(name: 'Adobe'),
        new Product(name: 'Sony'),
        new Product(name: 'Appel'),
        new Product(name: 'Microsoft'),
        new Product(name: 'Google'),
        new Product(name: 'IBM'),
        new Product(name: 'Micromadia'),
        new Product(name: 'Adobe'),
        new Product(name: 'Sony'),
      ]),
    );
  }
}

// کلاس سازنده یک محصول
// محصول ما در این مثال فقط شامل نام است
class Product {
  final String name;
  Product({this.name});
}

// تعریف یک تایپ جهت استفاده در ادامه کد
typedef void CartChangedCallBack(Product product, bool inCart);

// کلاس لیست محصولات
class ShoppingList extends StatefulWidget {
  // مجموعه ای از محصولات
  final List<Product> products;
  // سازنده کلاس که در ورودی مجموعه ای از محصولات را دریافت می کند
  ShoppingList({this.products});

  @override
  _ShoppingListState createState() => _ShoppingListState();
}

// کلاس استیت مربوط به لیست محصولات
class _ShoppingListState extends State<ShoppingList> {
  // مجموعه ای از محصولات که در حالت انتخاب قرار گرفته اند
  // این مجموعه در واقع سبد خرید ما را شکل داده است
  Set<Product> ShopingCart = Set<Product>();

  // تابع مدیریت سبد خرید
  // در ورودی یک محصول را دریافت و در صورتی که وجود داشته باشد حذف و در غیر اینصورت اضافه می کند
  void handelCartChanged(Product product, bool inCart) {
    setState(() {
      if (inCart) {
        // حذف یک محصول
        ShopingCart.remove(product);
      } else {
        // درج یک محصول
        ShopingCart.add(product);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My App'),
      ),
      body: ListView(
        padding: const EdgeInsets.all(5.0),
        // توسط تابع مپ بر روی لیست محصولات حرکت کرده و ویجت هر سطر ساخته می شود
        // توسط دستور widget می توانید به متغییرهای کلاس StateFull دسترسی داشته باشید
        children: widget.products.map((Product product) {
          // فراخوانی تابع سازنده هر سطر از محصول
          return ShoppingListItem(
            product: product,
            onCartChange: handelCartChanged,
            // اگر محصول در سبد خرید وجود داشته باشد مقدار True را پاس می دهد
            inCart: ShopingCart.contains(product),
          );
        }).toList(),
      ),
    );
  }
}

// تابع سازنده هر سطر از محصول
class ShoppingListItem extends StatelessWidget {
  final Product product; // آبجکت محصول
  final CartChangedCallBack onCartChange;  // تابع مدیریت سبد خرید
  final bool inCart;  // متغییر وضعیت انتخاب محصول

  // سازنده کلاس با سه ورودی
  ShoppingListItem({this.product, this.onCartChange, this.inCart});

  // تابع مدیریت رنگ پس زمینه بر اساس وضعیت انتخاب محصول
  Color getColorBackground(BuildContext context) {
    return inCart ? Colors.green : Theme.of(context).primaryColor;
  }

  // تابع مدیریت رنگ متن بر اساس وضعیت انتخاب محصول
  Color getColorText(BuildContext context) {
    return inCart ? Colors.red : Colors.black;
  }

  @override
  Widget build(BuildContext context) {
    return Card(
      child: ListTile(
        onTap: () {
          // فراخوانی تابع مدیریت سبد خرید
          onCartChange(product, inCart);
        },
        leading: CircleAvatar(
          backgroundColor: getColorBackground(context),
          child: Text(product.name[0]),
        ),
        title: Text(
          product.name,
          style: TextStyle(color: getColorText(context)),
        ),
        trailing: IconButton(
          onPressed: () {
            print('more: ${product.name}');
          },
          icon: Icon(Icons.more_vert),
        ),
      ),
    );
  }
}

خروجی نهایی کار در محیط اندروید استودیو :

می خوانم   شی گرایی در دارت

خروجی پروژه

امیدوارم این مطلب برای شما مفید باشد .

1+
محمدمجتبی جوارشکیان

محمدمجتبی جوارشکیان

من محمدمجتبی جوارشکیان ، کارشناس IT و فعال اجتماعی هستم و در حوزه معماری ، طراحی ، تحلیل گری ، مدلسازی و توسعه ی محیط های نرم افزاری فعالیت دارم. همانند سایر کارشناسان IT در تلاشم تا دنیا جای زیباتری برای زندگی باشد. بسیار خوشحال می شوم من را از انتقادات ، پیشنهادات و نظرات خود مطلع فرمایید. آدرس ایمیل : mjfakhr@yahoo.com

ارسال یک پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

3 − 1 =