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

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

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

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

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 و فعال اجتماعی هستم و در حوزه معماری ، طراحی ، تحلیل گری ، مدلسازی و توسعه ی محیط های نرم افزاری فعالیت دارم . بسیار خوشحال می شوم من را از انتقادات ، پیشنهادات و نظرات خود مطلع فرمایید . آدرس ایمیل : info@javareshkian.ir

ارسال یک پاسخ

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

3 − 2 =