Flutter购物车管理插件flutter_cart的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter购物车管理插件flutter_cart的使用

简介

logo

pub package

通过使用flutter_cart插件,您可以为您的Flutter应用赋予无缝的购物车管理功能。这个全面的Flutter包提供了广泛的购物车管理特性,简化了添加、移除和更新应用中商品的操作。凭借其易于使用的功能,管理应用的购物车从未如此简单。

sample

功能特性

  • 初始化:使用initializeCart()方法初始化flutter_cart。传递isPersistenceSupportEnabled参数为true以启用持久化支持。
  • 添加到购物车:使用addToCart方法将产品添加到购物车。
  • 更新数量:使用updateQuantity方法增加或减少商品的数量。
  • 从购物车移除:使用removeItem方法移除特定的商品。
  • 清空购物车:使用clearCart方法移除购物车中的所有商品。
  • 应用折扣:使用applyDiscount方法对商品应用折扣。注意:您也可以在添加商品到购物车时应用折扣。
  • 总金额:使用flutterCart.total获取购物车中商品的总金额。
  • 小计:使用flutterCart.subtotal获取购物车中商品的小计金额。
  • 商品数量:使用flutterCart.cartLength获取购物车中商品的总数。
  • 获取商品索引:使用getProductIndex方法获取购物车中商品的索引。
  • 获取特定商品:使用getSpecificProduct方法从购物车中获取特定商品。
  • 检查持久化支持状态:使用getPersistenceSupportStatus方法检查持久化支持的状态。

使用方法

要使用此插件,请在pubspec.yaml文件中添加flutter_cart作为依赖项:

dependencies:
  flutter:
    sdk: flutter
  flutter_cart:

注意:此包使用shared_preferences来保存购物车项目。

入门指南

初始化

首先,创建一个flutter_cart包的实例。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  var cart = FlutterCart();
  await cart.initializeCart(isPersistenceSupportEnabled: true);
  runApp(MyApp());
}

添加到购物车 🛒

当需要将商品添加到购物车时调用此方法。

void addToCart(YourProductModel product) {
  flutterCart.addToCart(
    cartModel: CartModel(
      // ... other parameters
      if [discount] is applicable and in percentage so, you can
      calculate the discount like this
      var discount = (product.discountPercentage / 100) * product.price;
      discount: discount,
      [productMeta] takes Map<String, dynamic> so, you can store your complete product data in productMeta
      productMeta: product.toJson()),
  );
}

更新数量 ➕/ ➖

用于增加或减少商品的数量。

void updateQuantity(CartModel item, int newQuantity) {
  flutterCart.updateQuantity(
    item.productId, 
    item.variants, 
    newQuantity
  );
}

移除商品 🗑️

用于从购物车中移除特定商品。

void removeItemFromCart(CartModel item) {
  flutterCart.removeItem(item.productId, item.variants);
}

清空购物车 🧹

用于移除购物车中的所有商品。

void clearCart() {
  flutterCart.clearCart();
}

获取购物车中的商品

List<CartModel> get getCartItems => flutterCart.cartItemsList;

总数量

int get getCartCount => flutterCart.cartLength;

总金额

double get getTotalAmount => flutterCart.total;

小计

double get subtotal => flutterCart.subtotal;

示例代码

以下是一个完整的示例代码,演示如何使用flutter_cart插件。

import 'package:flutter/material.dart';
import 'package:flutter_cart/flutter_cart.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  var cart = FlutterCart();
  await cart.initializeCart(isPersistenceSupportEnabled: true);
  runApp(MyApp(cart: cart));
}

class MyApp extends StatelessWidget {
  final FlutterCart cart;

  const MyApp({super.key, required this.cart});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Cart Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
        appBarTheme: const AppBarTheme(
          color: Colors.deepPurple,
          titleTextStyle: TextStyle(
            color: Colors.white, 
            fontWeight: FontWeight.w500, 
            fontSize: 20
          ),
        ),
      ),
      home: MyHomePage(cart: cart),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final FlutterCart cart;

  const MyHomePage({super.key, required this.cart});

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

class _MyHomePageState extends State<MyHomePage> {
  List<ProductModel> products = [
    ProductModel(id: "1", name: "Product 1", price: 10.0, discountPercentage: 10),
    ProductModel(id: "2", name: "Product 2", price: 20.0, discountPercentage: 0),
  ];

  void addToCart(ProductModel product) {
    double discount = (product.discountPercentage / 100) * product.price;
    widget.cart.addToCart(
      cartModel: CartModel(
        productId: product.id,
        productName: product.name,
        price: product.price,
        discount: discount,
        quantity: 1,
        productMeta: product.toJson(),
      ),
    );
  }

  void removeFromCart(CartModel item) {
    widget.cart.removeItem(item.productId, item.variants);
  }

  void clearCart() {
    widget.cart.clearCart();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter Cart Demo'),
      ),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              itemCount: products.length,
              itemBuilder: (context, index) {
                final product = products[index];
                return ListTile(
                  title: Text(product.name),
                  subtitle: Text('\$${product.price.toStringAsFixed(2)}'),
                  trailing: ElevatedButton(
                    onPressed: () => addToCart(product),
                    child: const Text('Add to Cart'),
                  ),
                );
              },
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                Text('Total Items: ${widget.cart.cartLength}'),
                Text('Total Amount: \$${widget.cart.total.toStringAsFixed(2)}'),
                ElevatedButton(
                  onPressed: clearCart,
                  child: const Text('Clear Cart'),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

class ProductModel {
  final String id;
  final String name;
  final double price;
  final double discountPercentage;

  ProductModel({
    required this.id,
    required this.name,
    required this.price,
    required this.discountPercentage,
  });

  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
      'price': price,
      'discountPercentage': discountPercentage,
    };
  }
}

以上是关于flutter_cart插件的详细使用说明和示例代码,希望对您有所帮助!如果您有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter购物车管理插件flutter_cart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter购物车管理插件flutter_cart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用flutter_cart插件来管理购物车的示例代码。flutter_cart插件通常用于管理购物车中的商品、数量、总价等。

首先,确保你已经在pubspec.yaml文件中添加了flutter_cart依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_cart: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来是一个简单的示例代码,展示如何使用flutter_cart插件来管理购物车:

main.dart

import 'package:flutter/material.dart';
import 'package:flutter_cart/flutter_cart.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Cart Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CartScreen(),
    );
  }
}

class CartScreen extends StatefulWidget {
  @override
  _CartScreenState createState() => _CartScreenState();
}

class _CartScreenState extends State<CartScreen> {
  final CartProvider cartProvider = CartProvider();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Shopping Cart'),
      ),
      body: CartProvider.withConsumer(
        provider: cartProvider,
        builder: (context, cart, child) => Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('Cart Items:', style: TextStyle(fontSize: 20)),
              SizedBox(height: 16),
              Expanded(
                child: cart.items.isEmpty
                    ? Center(child: Text('No items in cart'))
                    : ListView.builder(
                        itemCount: cart.items.length,
                        itemBuilder: (context, index) {
                          final item = cart.items[index];
                          return CartItemWidget(item: item, cart: cart);
                        }),
              ),
              SizedBox(height: 16),
              Text('Total: \$${cart.totalPrice.toStringAsFixed(2)}', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
            ],
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => AddItemScreen(cartProvider: cartProvider)),
        ),
        tooltip: 'Add Item',
        child: Icon(Icons.add),
      ),
    );
  }
}

class CartItemWidget extends StatelessWidget {
  final CartItem item;
  final Cart cart;

  CartItemWidget({required this.item, required this.cart});

  @override
  Widget build(BuildContext context) {
    return Card(
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Row(
          children: [
            Text('${item.name} - \$${item.price.toStringAsFixed(2)}'),
            Spacer(),
            Text('Quantity: ${item.quantity}'),
            IconButton(
              icon: Icon(Icons.remove),
              onPressed: () {
                if (item.quantity > 1) {
                  cart.removeItem(item.id, 1);
                }
              },
            ),
            IconButton(
              icon: Icon(Icons.add),
              onPressed: () {
                cart.addItem(item.id, 1);
              },
            ),
          ],
        ),
      ),
    );
  }
}

class AddItemScreen extends StatefulWidget {
  final CartProvider cartProvider;

  AddItemScreen({required this.cartProvider});

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

class _AddItemScreenState extends State<AddItemScreen> {
  final TextEditingController _nameController = TextEditingController();
  final TextEditingController _priceController = TextEditingController();
  final TextEditingController _quantityController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Add Item'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            TextField(
              controller: _nameController,
              decoration: InputDecoration(labelText: 'Item Name'),
            ),
            SizedBox(height: 16),
            TextField(
              controller: _priceController,
              decoration: InputDecoration(labelText: 'Price'),
              keyboardType: TextInputType.numberWithOptions(decimal: true),
            ),
            SizedBox(height: 16),
            TextField(
              controller: _quantityController,
              decoration: InputDecoration(labelText: 'Quantity'),
              keyboardType: TextInputType.number,
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                if (_nameController.text.isNotEmpty &&
                    _priceController.text.isNotEmpty &&
                    _quantityController.text.isNotEmpty) {
                  double price = double.parse(_priceController.text);
                  int quantity = int.parse(_quantityController.text);

                  widget.cartProvider.cart.addItem(
                    UUID().v4().toString(), // Generate a unique ID for the item
                    CartItem(
                      name: _nameController.text,
                      price: price,
                      quantity: quantity,
                    ),
                  );

                  Navigator.pop(context);
                }
              },
              child: Text('Add Item'),
            ),
          ],
        ),
      ),
    );
  }
}

说明:

  1. CartProvider: CartProvider是一个提供购物车状态的Provider。你可以使用CartProvider.withConsumer来访问购物车状态。

  2. CartScreen: 主屏幕,显示购物车中的商品列表和总价。有一个浮动按钮可以导航到添加商品屏幕。

  3. CartItemWidget: 显示购物车中每个商品的详细信息,包括名称、价格、数量和增减数量的按钮。

  4. AddItemScreen: 添加商品屏幕,用户可以输入商品名称、价格和数量,然后点击按钮将商品添加到购物车中。

  5. UUID().v4().toString(): 生成一个唯一ID用于商品。在实际应用中,你可能需要从服务器获取这些ID。

请确保你安装了uuid包来生成唯一ID,可以在pubspec.yaml中添加:

dependencies:
  uuid: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

这样,你就可以在Flutter应用中使用flutter_cart插件来管理购物车了。

回到顶部