当前位置: 首页 > 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.dtcms.com/a/302382.html

相关文章:

  • linux安装zsh,oh-my-zsh,配置zsh主题及插件的方法
  • 用了Flutter包体积增大就弃用Flutter吗?包体积与开发效率,这两者之间如何权衡?
  • 形参表不匹配(BUG)
  • 【Git】Linux-ubuntu 22.04 初步认识 -> 安装 -> 基础操作
  • 标准SQL语句示例
  • 专题:2025医药生物行业趋势与投融资研究报告|附90+份报告PDF、原数据表汇总下载
  • 云服务器以域名形式访问机房Kubernetes集群服务之解决方案
  • 时序数据基座升维:Apache IoTDB 以“端边云AI一体化”重构工业智能决策
  • 06-原型和原型链
  • iOS 离屏渲染
  • 【RH134 问答题】第 6 章 管理 SELinux 安全性
  • Java集合遍历的几种方式
  • 1.DRF 环境安装与配置
  • 基于springboot的编程训练系统设计与实现(源码+论文)
  • EMQX Webhook 调用本地 Supabase Edge Functions
  • 3.DRF视图和路由
  • JAVA后端开发——“全量同步”和“增量同步”
  • [AI Coding] 一.腾讯CodeBuddy IDE内测、安装及基本用法(国产AI IDE启航)
  • 使用node-cron实现Node.js定时任务
  • Office-PowerPoint-MCP-Server – 基于MCP的开源PPT生成与编辑工具
  • 每日面试题16:什么是双亲委派模型
  • DBSyncer:开源免费的全能数据同步工具,多数据源无缝支持!
  • 代码随想录day48单调栈1
  • Python全栈项目--基于深度学习的视频内容分析系统
  • html转word下载
  • 【GitHub Workflows 基础(二)】深入理解 on、jobs、steps 的核心语法与执行逻辑
  • Dify快速搭建问答系统
  • 3、CC3200串口DMA
  • Binary Classifier Optimization for Large Language Model Alignment
  • 亚远景-“过度保守”还是“激进创新”?ISO/PAS 8800的99.9%安全阈值之争