当前位置: 首页 > news >正文

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});@overrideWidget 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),];@overrideWidget 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'),),],),);},),],),);}
}
http://www.lryc.cn/news/602773.html

相关文章:

  • shell每日三题大神之路:第三天
  • 轻量级远程开发利器:Code Server与cpolar协同实现安全云端编码
  • AR眼镜:工业4.0时代高风险作业的安全守护者
  • 深度思考和搜索研究 最新的GSPO强化学习算法
  • 解决 xshell 无法连接win10 、win11的linux子系统
  • python每日一题练习
  • Java集合遍历的几种方式
  • 【docker】DM8达梦数据库的docker-compose以及一些启动踩坑
  • Thymeleaf th:object核心用法精解
  • LeetCode|Day28|67. 二进制求和|Python刷题笔记
  • OpenLayers 入门指南【四】:项目初始化
  • org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path
  • 下载k8s官方组件chart和容器镜像
  • 自动化测试常用函数
  • 网络编程概述与UDP编程
  • 关于前端的性能优化
  • 【数据架构09】人工智能及数据智能架构篇
  • pg数据库,本地服务器下不同端口迁移
  • 用了Flutter包体积增大就弃用Flutter吗?包体积与开发效率,这两者之间如何权衡?
  • 微信小程序点击输入框时,顶部导航栏被遮挡问题如何解决?
  • 鸿蒙打包签名
  • Linux驱动23 --- RkMedia 使用
  • gdb 基本命令
  • 3DGRUT: 革命性的3D高斯粒子光线追踪与混合光栅化技术深度解析
  • Error: Unable to find a match: python3.8
  • 【Linux操作系统】简学深悟启示录:Linux环境基础开发工具使用
  • Spring IOC与DI
  • 【服务器知识】nginx配置ipv6支持
  • JVM 内存共享区域详解
  • RabbitMQ概念与管理端配置说明