Flutter在购物场景中BLoC的应用

介绍BLoC的应用场景

一直在思考如何更加详细的介绍。

现在提供一个完整的购物场景 BLoC 示例,包括:

模型:Product

事件:AddProduct、RemoveProduct

状态:CartState 记录购物项和总价

BLoC:CartBloc 实现增删逻辑

界面:ShopPage 展示商品列表和购物车信息

下面的这段代码应该能完整的说明这个问题

复制代码
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

// 模型
class Product {
  final int id;
  final String name;
  final double price;
  Product({required this.id, required this.name, required this.price});
}

// 事件定义
abstract class CartEvent {}
class AddProduct extends CartEvent {
  final Product product;
  AddProduct(this.product);
}
class RemoveProduct extends CartEvent {
  final Product product;
  RemoveProduct(this.product);
}

// 状态定义
class CartState {
  final List<Product> items;
  final double total;
  CartState({required this.items}) : total = items.fold(0, (sum, p) => sum + p.price);
}

// BLoC 实现
class CartBloc extends Bloc<CartEvent, CartState> {
  CartBloc() : super(CartState(items: [])) {
    on<AddProduct>((event, emit) {
      final updated = List<Product>.from(state.items)..add(event.product);
      emit(CartState(items: updated));
    });
    on<RemoveProduct>((event, emit) {
      final updated = List<Product>.from(state.items)..remove(event.product);
      emit(CartState(items: updated));
    });
  }
}

// UI 示例
void main() {
  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BlocProvider(
        create: (_) => CartBloc(),
        child: const ShopPage(),
      ),
    );
  }
}

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

  final sampleProducts = const [
    Product(id: 1, name: 'T-Shirt', price: 29.99),
    Product(id: 2, name: 'Jeans', price: 59.99),
    Product(id: 3, name: 'Sneakers', price: 89.99),
  ];

  @override
  Widget build(BuildContext context) {
    final cartBloc = context.read<CartBloc>();
    return Scaffold(
      appBar: AppBar(title: const Text('Shop')),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              itemCount: sampleProducts.length,
              itemBuilder: (context, index) {
                final product = sampleProducts[index];
                return ListTile(
                  title: Text(product.name),
                  subtitle: Text("\$${product.price}"),
                  trailing: IconButton(
                    icon: const Icon(Icons.add_shopping_cart),
                    onPressed: () => cartBloc.add(AddProduct(product)),
                  ),
                );
              },
            ),
          ),
          const Divider(),
          BlocBuilder<CartBloc, CartState>(
            builder: (context, state) {
              return Padding(
                padding: const EdgeInsets.all(16.0),
                child: Column(
                  children: [
                    Text('Items in Cart: ${state.items.length}'),
                    Text('Total: \$${state.total.toStringAsFixed(2)}'),
                    ElevatedButton(
                      onPressed: state.items.isEmpty ? null : () {
                        // 结算逻辑
                        ScaffoldMessenger.of(context).showSnackBar(
                          const SnackBar(content: Text('Proceed to checkout')),
                        );
                      },
                      child: const Text('Checkout'),
                    ),
                  ],
                ),
              );
            },
          ),
        ],
      ),
    );
  }
}
相关推荐
小雨下雨的雨6 分钟前
Flutter 框架跨平台鸿蒙开发 —— ListView 控件之高效列表渲染艺术
flutter·华为·harmonyos
行者9616 分钟前
Flutter在OpenHarmony平台的文件上传组件深度实践
flutter·harmonyos·鸿蒙
行者9620 分钟前
Flutter跨平台开发适配OpenHarmony:进度条组件的深度实践
开发语言·前端·flutter·harmonyos·鸿蒙
cn_mengbei22 分钟前
Flutter for OpenHarmony 实战:RangeSlider 范围滑块详解
flutter
奋斗的小青年!!23 分钟前
Flutter适配OpenHarmony:打造无缝国际化用户体验的实战指南
flutter·harmonyos·鸿蒙
奋斗的小青年!!24 分钟前
Flutter跨平台数据筛选器:深度适配OpenHarmony实战指南
flutter·harmonyos·鸿蒙
恋猫de小郭34 分钟前
Tailwind 因为 AI 的裁员“闹剧”结束,而 AI 对开源项目的影响才刚刚开始
前端·flutter·ai编程
奋斗的小青年!!2 小时前
Flutter与OpenHarmony深度协同:SnackBar组件的跨平台适配实战
flutter·harmonyos·鸿蒙
行者962 小时前
OpenHarmony Flutter跨平台开发:树形视图组件的实践与性能优化
flutter·性能优化·harmonyos·鸿蒙
LawrenceLan17 小时前
Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字
开发语言·flutter·dart