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

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.xdnf.cn/news/16544.html

相关文章:

  • MySQL面试题及详细答案 155道(001-020)
  • 无人机气动设计模块解析
  • 微信小程序点击输入框时,顶部导航栏被遮挡问题如何解决?
  • 秩为1的矩阵的特征和性质
  • 【数据库】时序数据库选型指南:从大数据视角看IoTDB的核心优势
  • <PLC><西门子><modbusTCP>在西门子S7-1200系列PLC中,如何设置modbusTCP通讯?
  • 语音识别指标计算 WER
  • Java-泛型类的定义与使用
  • 24. 了解过 webp 吗
  • 如何进行DAP-seq的数据挖掘,筛选验证位点
  • Django 视图详解(View):处理请求与返回响应的核心
  • CenterOS8.5三台机器配置互信
  • 图解MySQL-小林code笔记
  • 排水管网实时监测筑牢城市安全防线
  • 本地大语言模型部署指南
  • Dify 工作流深度解析与实战指南
  • 重复文件清理工具,附免费链接
  • RWA 正当红,是 DeFi 的终点、拐点,还是新起点?
  • 常用设计模式系列(十四)—模板方法模式
  • HTML响应式SEO公司网站源码
  • 电脑开机不显示网卡的原因
  • 微算法科技(NASDAQ:MLGO)利用基于区块链的机器学习模型进行交易分类,实现交易数据的匿名化
  • Python 列表内存存储本质:存储差异原因与优化建议
  • ubnutu网络
  • Excel常用函数大全,非常实用
  • 旋变转换电路
  • Vue组件通信的终极指南
  • 【数据库】使用Sql Server将分组后指定字段的行数据转为一个字段显示,并且以逗号隔开每个值,收藏不迷路
  • uniapp,uview 报错:Not Found:Page[2][-1;-1,8,0,28] at view.umd.min.js:1
  • 从fork到exit:剖析Linux进程的诞生、消亡机制