پروژه مینی سبد خرید
در این پروژه شما با ویجت های 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), ), ), ); } }
خروجی نهایی کار در محیط اندروید استودیو :
امیدوارم این مطلب برای شما مفید باشد .