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。

相关新闻

最新新闻

Webpack stats文件深度解析:Bonsai如何帮你发现隐藏的性能瓶颈

Webpack stats文件深度解析:Bonsai如何帮你发现隐藏的性能瓶颈

Webpack stats文件深度解析:Bonsai如何帮你发现隐藏的性能瓶颈 【免费下载链接】bonsai Understand the tree of dependencies inside your webpack bundles, and trim away the excess. 项目地址: https://gitcode.com/gh_mirrors/bon/bonsai 在现代前端开发…

2026/7/12 19:34:08
华为海思硬件加速器性能优化:kae_driver配置调优的7个实用技巧

华为海思硬件加速器性能优化:kae_driver配置调优的7个实用技巧

华为海思硬件加速器性能优化:kae_driver配置调优的7个实用技巧 【免费下载链接】kae_driver 项目地址: https://gitcode.com/openeuler/kae_driver 前往项目官网免费下载:https://ar.openeuler.org/ar/ 在当今高性能计算和网络安全领域&#xf…

2026/7/12 19:34:08
ChatDocs核心功能深度解析:支持12种文档格式的AI对话神器

ChatDocs核心功能深度解析:支持12种文档格式的AI对话神器

ChatDocs核心功能深度解析:支持12种文档格式的AI对话神器 【免费下载链接】chatdocs Chat with your documents offline using AI. 项目地址: https://gitcode.com/gh_mirrors/ch/chatdocs ChatDocs是一款支持本地文档与AI对话的工具,它让你无需联…

2026/7/12 19:34:08
影像系统模块概念与术语(1)

影像系统模块概念与术语(1)

影像系统的基础是相通的,但各平台的实现机制却各有千秋。我认为深入理解 Camera 系统的底层架构,不仅是夯实基础的关键,更是为了在工作中准确定位自己负责的模块,以及制定好多模块联动预案的前提。 本文基于高通 CamX 架构,梳理其中的核心名词与数据链路,并结合展锐平台进…

2026/7/12 19:34:08
对刀仪经常报 “接触过载“?内部微动结构与光电原理

对刀仪经常报 “接触过载“?内部微动结构与光电原理

对刀仪经常报接触过载🔧 搜索摘要:对刀仪维保专篇——接触式对刀仪频繁报警"接触过载"的诊断与修复。本文由宁波匠测科技(专注工业精密测量15年)基于官方手册和现场案例原创编制,强调一个重要技术细节&#…

2026/7/12 19:34:08
Zero-shot提示词效能跃迁:从准确率42%到89%的7步实战框架(附可复用模板库)

Zero-shot提示词效能跃迁:从准确率42%到89%的7步实战框架(附可复用模板库)

更多请点击: https://codechina.net 第一章:Zero-shot提示词效能跃迁:从准确率42%到89%的7步实战框架(附可复用模板库) Zero-shot提示工程并非“不给示例就靠运气”,而是通过结构化语义锚点、任务意图显式…

2026/7/12 19:29:08

月新闻