Flutter/HarmonyOS 实战|中式美食买菜清单勾选状态:checkedIds、统计卡与可点击食材条
📅 2026/7/8 20:33:15
👁️ 次浏览
上一篇写买菜清单页时重点讲的是“从一桌方案拆出采购分组”。这篇往里再走一步用户真的开始核对食材时页面状态应该怎么跟着变。买菜清单这种页面最容易被做成静态列表。菜名、数量、备注都摆出来好像就完成了。但真实使用时用户需要一边看一边确认鱼买了没有排骨买了没有青菜能不能换调味料家里有没有。这个时候勾选状态和进度反馈就很重要。中式美食当前的做法是用checkedIds统一记录已确认食材再让统计卡、食材条和底部动作一起响应这个状态。这样用户看一眼就知道清单还差几项不用自己在脑子里数。本文验证环境项目版本或范围开发工具Flutter / Dart 工程配合 DevEco Studio 做 HarmonyOS 上架前体验验证Dart SDK^3.12.2Flutter 依赖flutter、cupertino_icons、flutter_lintsHarmonyOS 目标中式美食上架后的家庭餐桌链路HarmonyOS SDK API 20 作为后续适配目标核心文件lib/main.dart核心页面ShoppingListPage核心组件ShoppingSummaryCard、ShoppingSection、ShoppingIngredientSlip核心状态checkedIds这里讲的是当前 Flutter 工程里的真实实现。后面如果迁移到 ArkUI思路仍然一样一个集合记录已确认项列表和统计都从这个集合派生。不要给每个条目单独维护状态清单页初始化时会先根据当前餐桌方案生成分组再把默认已确认的食材放进checkedIdsclass_ShoppingListPageStateextendsStateShoppingListPage{latefinalListShoppingSectionDatasections;latefinalSetStringcheckedIds;overridevoidinitState(){super.initState();sectionsshoppingSectionsFor(widget.plan);checkedIds{for(finalsectioninsections)for(finaliteminsection.items)if(item.checked)item.id,};}}这个写法的关键是页面不直接改ShoppingItemData.checked。如果用户点一下就去改数据对象本身后面会出现两个麻烦。第一原始清单和当前确认状态混在一起第二想重置、保存、对比变化时不好做。用SetString存 id 会清爽很多原始清单还是原始清单用户当前操作是另一层状态。这类页面我更喜欢把“数据是什么”和“用户现在点了什么”分开。前者来自方案后者来自页面交互。勾选切换要足够简单toggleItem()的逻辑很直白voidtoggleItem(Stringid){setState((){if(!checkedIds.add(id)){checkedIds.remove(id);}});}Set.add()如果发现 id 已经存在会返回false。所以这里可以很自然地写成加不进去就说明已经勾过了那就移除。这个逻辑小但它决定了交互是否稳定。用户连点几次不会把状态弄乱列表刷新后统计也会一起变。统计卡不要只是装饰清单页顶部的统计卡会展示总项数和已确认项intgettotalItemssections.fold(0,(total,section)totalsection.items.length);ShoppingSummaryCard(totalItems:totalItems,checkedCount:checkedIds.length,)这里的checkedCount直接来自checkedIds.length不是另起一个计数器。这是一个很重要的习惯能从状态算出来的值就不要再存一份。否则用户勾选了食材列表状态变了但统计数字没变这种 bug 很难看。显示项来源作用食材总类sections汇总告诉用户这次采购复杂度已确认数量checkedIds.length告诉用户还差多少项预计采购时间页面配置给用户一个心理预期统计卡不是为了好看而是为了让用户知道自己进行到哪了。食材条要整行可点移动端上如果只让用户点一个小圆圈体验会比较累。中式美食这里把整条食材都做成可点击classShoppingIngredientSlipextendsStatelessWidget{constShoppingIngredientSlip({requiredthis.item,requiredthis.checked,requiredthis.onToggle,});finalShoppingItemDataitem;finalbool checked;finalVoidCallbackonToggle;}真实组件里外层用了InkWell里面的小勾选圈也能点。这样用户在超市或者厨房里拿着手机不需要精确点中一个很小的控件手指点到整行就能切换状态。这类细节看着不技术但很影响留存。生活类工具不是给用户演示组件的用户是在边走边看甚至手上还拿着东西。交互热区大一点体验会舒服很多。备注要跟状态一起读食材条里除了名称和数量还有备注classShoppingItemData{constShoppingItemData({requiredthis.id,requiredthis.name,requiredthis.amount,this.note,this.checkedfalse,});finalStringid;finalStringname;finalStringamount;finalString?note;finalbool checked;}比如“小青菜可换菜心”。这个备注会影响用户是否勾选如果现场没有小青菜但有菜心用户知道可以替换就不会停在那里纠结。所以买菜清单的条目不应该只有name。数量、备注、默认状态都值得放进模型里。后面如果接家庭库存甚至可以继续加“家里已有”“常买品牌”“预计价格”。工程验收记录检查点当前结果默认勾选initState()根据ShoppingItemData.checked初始化checkedIds状态切换toggleItem()通过Set增删 id状态逻辑简单统计反馈ShoppingSummaryCard使用checkedIds.length展示已确认数量整行点击ShoppingIngredientSlip外层可点击小勾选圈也可点击数据边界原始食材数据和用户当前勾选状态分开后续扩展可以继续接家庭库存、替换建议、价格估算本文小结买菜清单的价值不只是列出食材而是帮用户把“我确认了什么、还差什么”看清楚。中式美食这里用checkedIds管住勾选状态用统计卡反馈进度再把整行食材做成可点击。这个实现不花哨但很适合家庭餐食场景用户在买菜时不想研究页面只想快速确认下一项。如果你也在做清单类页面我建议先把两个问题想清楚状态是不是只有一个来源用户是不是能不用精确点击也完成操作这两个点做好页面会比单纯堆视觉组件更耐用。最后留个具体问题如果买菜清单支持多人协作你会把checkedIds做成本地状态同步还是直接把每个食材的确认状态写进远端记录我会先本地跑顺再把状态同步抽出去。
iwebsec靶场XXE漏洞实战:3种外部实体利用方式与Burp Collaborator盲注 在渗透测试领域,XML外部实体注入(XXE)漏洞常被低估却极具破坏力。iwebsec靶场作为国内知名的Web安全演练平台,其XXE漏洞场景设计精巧,…
📅 2026/7/8 20:33:15
NetBackup 10.1 外部CA配置后登录失败:5步排查与证书存储修复当企业级备份解决方案Veritas NetBackup 10.1与外部证书颁发机构(CA)集成时,管理员常会遇到管理控制台登录失败的问题。这种故障不仅影响日常运维效率,更可能延误关键备份任务的执…
📅 2026/7/8 20:33:15
Nacos <2.2.0 JWT 默认密钥漏洞实战:从原理到防御的深度解析漏洞背景与影响范围在云原生技术快速发展的今天,服务发现与配置管理平台已成为现代应用架构的核心组件。作为阿里巴巴开源的一款重要产品,Nacos(Naming and Configur…
📅 2026/7/8 20:33:15
如何3分钟永久保存B站视频:m4s-converter的完整解决方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter
你是否曾经有过这样的经历&a…
📅 2026/7/8 21:35:43
Linux 路径解析:5个核心命令与3种路径表示法实战解析刚接触Linux时,最让我困惑的就是那些看似随意却又暗藏玄机的路径写法。记得第一次在终端里输入cd /usr/local/bin时,我完全不明白为什么路径要用斜杠分隔,也不知道为什么有些命…
📅 2026/7/8 21:35:43
如何轻松下载MOOC课程实现永久学习:完整实用指南 【免费下载链接】MoocDownloader An MOOC downloader implemented by .NET. 一枚由 .NET 实现的 MOOC 下载器. 项目地址: https://gitcode.com/gh_mirrors/mo/MoocDownloader
你是否曾经为网络卡顿而错过重要…
📅 2026/7/8 21:35:43
🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在寻找一款真正能本地部署、效果不输付费版的AI生图和视频工具,那么Seedance2.5绝对值得你花时间了解。市面上充斥…
📅 2026/7/8 21:35:43
Volatility 2.6 内存取证深度实战:从Windows 10镜像中提取关键证据链在数字取证领域,内存分析往往能揭示传统磁盘取证难以获取的关键证据。当系统运行时,大量临时数据、加密内容和解压后的恶意代码都会在内存中留下痕迹。本文将带您深入探索如…
📅 2026/7/8 21:35:43
Windows OpenSSH Server 高级配置:防火墙规则与公钥认证权限修复实战Windows系统管理员经常需要在Windows服务器上配置OpenSSH Server以实现安全的远程访问和文件传输。然而,在实际部署过程中,防火墙规则配置不当和公钥认证权限问题是最常见的…
📅 2026/7/8 21:33:43
Docker 彻底卸载指南:CentOS/Ubuntu 双系统 5 步清理残留文件当 Docker 环境出现版本冲突、安装失败或需要迁移时,常规的卸载命令往往无法彻底清理系统。残留的配置文件、依赖项和缓存文件可能导致新安装的 Docker 出现各种诡异问题。本文将提供一套完整…
📅 2026/7/8 0:00:10
SQL 数据分析性能优化实战:窗口函数 vs 子查询 vs 临时表 在数据分析工作中,SQL查询性能往往是决定工作效率的关键因素。面对复杂的业务场景,如何选择最优的查询方案?本文将深入对比窗口函数、子查询和临时表三种技术方案…
📅 2026/7/8 0:00:10
日期:2026-07-07> 本期聚焦近一日(2026-07-06 至 07-07)出台的金融与行业政策,按"背景—核心—影响—受益/风险"四维度解读。政策内容依据原始发布信息整理,解读仅供参考,不构成投资建议。一、…
📅 2026/7/8 0:00:10
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/8 14:10:54
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/8 14:10:54
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/8 11:28:59
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/8 14:10:54
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/8 14:10:54
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/8 14:10:54