在这里插入图片描述

一、购物车功能

初始状态

添加商品

移除商品

清空购物车

Empty

HasItems

功能 说明
商品列表 展示可购买商品
添加商品 加入购物车
删除商品 移除商品
价格计算 自动计算总价
数量统计 显示商品数量

二、ShoppingCartProvider实现

class ShoppingCartProvider extends InheritedWidget {
  final List<CartItem> items;
  final Function(CartItem) addItem;
  final Function(CartItem) removeItem;

  const ShoppingCartProvider({
    required this.items,
    required this.addItem,
    required this.removeItem,
    required Widget child,
  }) : super(child: child);

  static ShoppingCartProvider of(BuildContext context) {
    final ShoppingCartProvider? result = context
        .dependOnInheritedWidgetOfExactType<ShoppingCartProvider>();
    assert(result != null, 'No ShoppingCartProvider found');
    return result!;
  }

  double get total =>
      items.fold(0, (sum, item) => sum + item.price);

  
  bool updateShouldNotify(ShoppingCartProvider oldWidget) {
    return items.length != oldWidget.items.length;
  }
}

三、数据流转

true

false

用户操作

addItem/removeItem

setState

Provider重建

updateShouldNotify

CartSummary重建

保持原状

四、状态管理策略

购物车状态

商品列表

添加操作

删除操作

价格计算

List

addItem方法

removeItem方法

total getter

五、ProductCard组件

class ProductCard extends StatelessWidget {
  final CartItem product;

  const ProductCard({super.key, required this.product});

  
  Widget build(BuildContext context) {
    return Card(
      margin: const EdgeInsets.only(bottom: 12),
      child: ListTile(
        leading: Text(product.image, style: const TextStyle(fontSize: 32)),
        title: Text(product.name),
        subtitle: Text(${product.price.toStringAsFixed(2)}'),
        trailing: ElevatedButton(
          onPressed: () {
            ShoppingCartProvider.of(context).addItem(product);
          },
          child: const Text('添加'),
        ),
      ),
    );
  }
}

六、CartSummary组件

class CartSummary extends StatelessWidget {
  const CartSummary({super.key});

  
  Widget build(BuildContext context) {
    final cart = ShoppingCartProvider.of(context);

    return Container(
      padding: const EdgeInsets.all(16),
      decoration: BoxDecoration(
        color: Theme.of(context).colorScheme.surface,
        boxShadow: [
          BoxShadow(
            color: Colors.black.withOpacity(0.1),
            blurRadius: 4,
          ),
        ],
      ),
      child: Column(
        children: [
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Text('购物车 (${cart.items.length})'),
              Text(
                '总计: ¥${cart.total.toStringAsFixed(2)}',
                style: const TextStyle(
                  fontWeight: FontWeight.bold,
                  color: Colors.red,
                ),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐