AtomGit Flutter 鸿蒙客户端: 情绪日记的三 Tab 架构 Tab 是移动端最高效的信息组织方式之一。本文详解 DiaryPage 的三 Tab 架构设计与数据共享。一、Tab 配置// diary_page.dartclass_DiaryPageStateextendsStateDiaryPagewithSingleTickerProviderStateMixin{lateTabController_tabController;overridevoidinitState(){super.initState();_tabControllerTabController(length:3,vsync:this);widget.moodStorage.addListener(_loadMoods);_loadMoods();}}SingleTickerProviderStateMixin提供 Ticker帧回调TabController 需要它来驱动标签页的切换动画。二、TabBar TabBarViewoverrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText(情绪日记),bottom:TabBar(controller:_tabController,tabs:const[Tab(text:记录),// Tab 0Tab(text:时间线),// Tab 1Tab(text:统计),// Tab 2],),),body:TabBarView(controller:_tabController,children:[_buildRecordTab(),_buildTimelineTab(),_buildStatsTab(),],),);}★ Insight ─────────────────────────────────────将 TabBar 放在 AppBar 的bottom属性中使标签页成为导航栏的一部分——这是 Material Design 的标准模式。用户在切换标签时标签栏始终可见不会随内容滚动消失。─────────────────────────────────────────────────三、三 Tab 的数据流MoodStorage (单例) ↓ addListener(_loadMoods) _loadMoods() { _allMoods storage.getAll(); ← 所有 Tab 共用 _weekMoods storage.getByWeek(); ← 统计 Tab 专用 } ↓ setState() Tab 0: _selectedMood, _noteController (本地状态) Tab 1: _allMoods (共享数据) Tab 2: _weekMoods (共享数据)关键设计数据在 _loadMoods() 中统一加载然后所有 Tab 都能访问。四、Tab 0记录页Widget_buildRecordTab(){returnSingleChildScrollView(padding:constEdgeInsets.all(20),child:Column(children:[// 日期选择器Row(children:[IconButton(icon:Icons.chevron_left,onPressed:goToPrevDay),Text(_formatDate(_selectedDate)),IconButton(icon:Icons.chevron_right,onPressed:goToNextDay),],),// 情绪选择器MoodPicker(selected:_selectedMood,onChanged:(m)setState(...)),// 备注输入TextField(controller:_noteController,maxLength:500,maxLines:3),// 保存按钮ElevatedButton(onPressed:_saveMood),],),);}五、Tab 间联动编辑功能void_editMood(MoodEntrymood){if(mood.idnull)return;_noteController.textmood.note??;setState((){_selectedMoodmood.moodType;_selectedDatemood.createdAt;_editingIdmood.id;});_tabController.animateTo(0);// 自动切换到记录Tab}从时间线Tab 1底部弹窗点击编辑→自动跳转到记录 TabTab 0并回填数据。TabController 的animateTo(0)提供了平滑的切换动画。六、Tab 2统计页Widget_buildStatsTab(){returnSingleChildScrollView(padding:constEdgeInsets.all(20),child:Column(children:[constText(本周心情),constSizedBox(height:16),MoodChart(weekMoods:_weekMoods),constSizedBox(height:16),Text(MoodChart.summaryText(_weekMoods)),],),);}简洁的布局标题 图表 AI 式总结文字。七、生命周期清理overridevoiddispose(){widget.moodStorage.removeListener(_loadMoods);_tabController.dispose();_noteController.dispose();super.dispose();}三个资源都要清理数据监听器、Tab 控制器、文本控制器。小结三 Tab 架构是移动端信息密集型页面的标准解法。E-Brufen 的实现体现了三个关键原则统一数据加载一个 _loadMoods 服务所有 Tab、Tab 间联动编辑跳转回记录、资源清理三个 dispose。作者简介E-Brufen DevFlutter 鸿蒙开发者专注于跨平台移动应用开发与心理健康数字化,项目地址AtomGit - E-Brufen。

相关新闻

最新新闻

Token机制与API代理网关:AI服务用量控制与限流实践

Token机制与API代理网关:AI服务用量控制与限流实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/4 1:51:38
Spring Boot 3 集成 Apollo 配置中心实战指南

Spring Boot 3 集成 Apollo 配置中心实战指南

抱歉,我无法根据这个标题生成一篇 CSDN 技术博客文章。原因是:这个标题指向的是音乐/艺术内容,与 CSDN 技术博客定位(编程、开发工具、框架、中间件、AI 工程等)不匹配。同时,你没有提供项目正文、关键词或…

2026/9/4 1:16:37
ZYNQ7020最小系统板量产级设计实战指南

ZYNQ7020最小系统板量产级设计实战指南

简介:本资源是一套已通过量产验证的ZYNQ7020最小系统板完整硬件设计资料,面向FPGA与嵌入式系统开发者、高校教学实验及工业边缘计算原型设计者,解决ZYNQ平台核心板自主设计、原理图复现、PCB叠层参考与3D结构协同开发等实际需求。压缩包共60个…

2026/9/4 1:11:36
STM32H743 QSPI Flash XIP运行程序:从Bootloader到内存映射实战

STM32H743 QSPI Flash XIP运行程序:从Bootloader到内存映射实战

简介:本资源是一套面向嵌入式开发工程师与进阶学习者的STM32H743单片机实战项目源码,聚焦于在QSPI Flash中安全运行用户应用程序的核心技术难点,适用于工业控制、智能终端等对程序存储可靠性与启动灵活性要求较高的场景。压缩包共458个文件&a…

2026/9/4 1:11:36
基于YOLO的端到端人脸表情识别:从多任务学习到工程部署全解析

基于YOLO的端到端人脸表情识别:从多任务学习到工程部署全解析

简介:本资源是一个基于YOLO架构实现的人脸表情识别系统,面向计算机视觉初学者、AI开发者及高校课程实践者,解决实时人脸检测与七类基础表情(如高兴、愤怒、悲伤等)分类的实际任务。系统融合YOLO高效目标检测能力与表情…

2026/9/4 1:06:36
LangChain与Guardrails构建安全AI Agent:PII检测与多层防护实战

LangChain与Guardrails构建安全AI Agent:PII检测与多层防护实战

1. 背景与核心概念在AI大模型技术快速发展的今天,AI Agent(智能代理)已成为企业智能化转型的核心工具。然而,随着AI应用场景的不断扩展,安全问题日益凸显——模型幻觉、数据泄露、恶意指令执行等风险直接影响业务稳定性…

2026/9/4 1:06:36