Flutter 框架跨平台鸿蒙开发 - 跟生活有关的心情日记应用开发

作者:小雨天気.日期:2026/4/7

欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图

image-20260405112931432

image-20260405112936614

image-20260405112942560

image-20260405112952042

image-20260405112958207

1.1 应用简介

心情日记是一款专注于情感记录与追踪的移动应用,为用户提供一个私密、便捷的空间记录每日心情变化。在快节奏的现代生活中,人们常常忽略了对自身情绪的关注与觉察,本应用帮助用户追踪情绪轨迹,从而更好地了解自己、关爱自己。

应用支持八种心情类型选择,配以表情符号与主题色彩,让情绪表达更加直观生动。日记撰写支持标题、内容、日期、地点、天气等全方位记录,标签管理功能让日记分类更加灵活。心情统计功能可视化展示各心情占比,帮助用户洞察情绪规律。

1.2 核心功能

功能模块功能描述实现方式
心情选择八种心情类型,配以表情符号与主题色彩GridView选择器
日记撰写标题、内容、日期、地点、天气全方位记录表单页面
标签管理自定义标签,灵活分类日记内容Chip组件
搜索筛选按关键词、心情类型快速定位日记TextField过滤
心情统计可视化展示各心情占比,洞察情绪规律AlertDialog + 进度条
日记详情沉浸式阅读体验,完整展示日记信息详情页面
日记编辑修改已有日记内容表单预填充
日记删除删除不需要的记录确认对话框

1.3 日记记录字段

字段类型说明
日记IDString唯一标识,时间戳生成
日记标题String日记名称,必填
日记内容String日记正文,必填
心情类型MoodType八种心情枚举
日记日期DateTime日记记录日期
标签列表List分类标签
地点String记录地点
天气String当日天气
创建时间DateTime记录创建时间
更新时间DateTime最后修改时间

1.4 技术栈

技术领域技术选型版本要求
开发框架Flutter>= 3.0.0
编程语言Dart>= 2.17.0
设计规范Material Design 3-
状态管理setState-
目标平台鸿蒙OSAPI 21+

1.5 项目结构

1lib/
2└── main_mood_diary.dart
3    ├── MoodDiaryApp           # 应用入口
4    ├── MoodType               # 心情类型枚举
5    ├── MoodDiary              # 日记数据模型
6    ├── MoodDiaryPage          # 主列表页面
7       ├── _buildMoodSummary()    # 心情概览卡片
8       ├── _buildSearchBar()      # 搜索栏
9       ├── _buildDiariesList()    # 日记列表
10       ├── _buildDiaryCard()      # 日记卡片
11       └── _showStatistics()      # 统计对话框
12    ├── MoodDiaryEditPage      # 编辑页面
13       ├── _selectDate()          # 日期选择
14       ├── _addTag()              # 添加标签
15       └── _save()                # 保存日记
16    └── MoodDiaryDetailPage    # 详情页面
17

二、系统架构

2.1 整体架构图

Data Layer

Business Logic

Presentation Layer

列表页面

心情概览卡片

搜索栏

日记卡片列表

编辑页面

心情选择器

表单输入区

标签管理区

详情页面

心情展示区

内容展示区

日记管理
增删改查

心情统计
占比计算

筛选搜索
_filteredDiaries

今日心情
计算逻辑

MoodDiary
日记模型

MoodType
心情枚举

2.2 类图设计

contains

manages

has

navigates

navigates

MoodDiaryApp

+Widget build()

«enumeration»

MoodType

happy

sad

angry

anxious

calm

excited

tired

grateful

MoodDiary

+String id

+String title

+String content

+MoodType mood

+DateTime date

+List<String> tags

+String location

+String weather

+DateTime createdAt

+DateTime updatedAt

+String moodText

+String moodEmoji

+Color moodColor

MoodDiaryPage

-List<MoodDiary> _diaries

-String _searchQuery

-MoodType? _selectedMood

-List<MoodDiary> _filteredDiaries

-Map<MoodType,int> _moodStats

+Widget build()

-void _addDiary()

-void _editDiary()

-void _deleteDiary()

MoodDiaryEditPage

-MoodDiary? diary

-TextEditingController _titleController

-TextEditingController _contentController

-MoodType _selectedMood

-List<String> _tags

+void _save()

+void _addTag()

+void _selectDate()

MoodDiaryDetailPage

+MoodDiary diary

+Widget build()

2.3 数据流程图

新建

编辑

删除

查看

搜索

筛选

统计

用户操作

操作类型

打开编辑页面

打开编辑页面-预填充

确认对话框

打开详情页面

过滤日记列表

按心情过滤

显示统计对话框

选择心情

填写内容

添加标签/地点/天气

保存日记

更新日记列表

计算各心情数量

计算占比百分比

显示统计结果

2.4 心情统计流程

数据模型 统计对话框 主页面 用户 数据模型 统计对话框 主页面 用户 点击统计按钮 获取所有日记 返回日记列表 遍历心情类型 计算各心情数量 计算占比百分比 显示统计结果 展示进度条图表


三、核心模块设计

3.1 数据模型设计

3.1.1 心情类型枚举 (MoodType)
1enum MoodType {
2  happy,    // 开心
3  sad,      // 难过
4  angry,    // 愤怒
5  anxious,  // 焦虑
6  calm,     // 平静
7  excited,  // 兴奋
8  tired,    // 疲惫
9  grateful, // 感恩
10}
11
3.1.2 心情属性映射
心情类型中文名称表情符号主题颜色
happy开心😊黄色
sad难过😢蓝色
angry愤怒😠红色
anxious焦虑😰紫色
calm平静😌绿色
excited兴奋🤩橙色
tired疲惫😴灰色
grateful感恩🙏粉色
3.1.3 日记模型 (MoodDiary)
1class MoodDiary {
2  final String id;                  // 唯一标识
3  String title;                     // 日记标题
4  String content;                   // 日记内容
5  MoodType mood;                    // 心情类型
6  DateTime date;                    // 日记日期
7  List<String> tags;                // 标签列表
8  String location;                  // 地点
9  String weather;                   // 天气
10  DateTime createdAt;               // 创建时间
11  DateTime updatedAt;               // 更新时间
12
13  MoodDiary({
14    required this.id,
15    required this.title,
16    required this.content,
17    required this.mood,
18    required this.date,
19    this.tags = const [],
20    this.location = '',
21    this.weather = '',
22    required this.createdAt,
23    required this.updatedAt,
24  });
25
26  String get moodText;    // 心情中文名称
27  String get moodEmoji;   // 心情表情符号
28  Color get moodColor;    // 心情主题颜色
29}
30

3.2 筛选过滤算法

3.2.1 过滤流程

获取全部日记

是否选择心情?

按心情类型过滤

是否有搜索词?

关键词匹配过滤

按日期排序

返回过滤结果

3.2.2 过滤实现
1List<MoodDiary> get _filteredDiaries {
2  var diaries = _diaries.toList();
3
4  // 心情类型过滤
5  if (_selectedMood != null) {
6    diaries = diaries.where((d) => d.mood == _selectedMood).toList();
7  }
8
9  // 关键词搜索
10  if (_searchQuery.isNotEmpty) {
11    diaries = diaries.where((d) {
12      return d.title.toLowerCase().contains(_searchQuery.toLowerCase()) ||
13          d.content.toLowerCase().contains(_searchQuery.toLowerCase()) ||
14          d.tags.any((tag) =>
15              tag.toLowerCase().contains(_searchQuery.toLowerCase()));
16    }).toList();
17  }
18
19  // 按日期倒序排列
20  diaries.sort((a, b) => b.date.compareTo(a.date));
21  return diaries;
22}
23

3.3 心情统计算法

3.3.1 统计流程

遍历心情类型

统计该心情日记数量

计算总数

计算占比百分比

生成进度条数据

3.3.2 统计实现
1Map<MoodType, int> get _moodStats {
2  final stats = <MoodType, int>{};
3  for (var mood in MoodType.values) {
4    stats[mood] = _diaries.where((d) => d.mood == mood).length;
5  }
6  return stats;
7}
8
9// 在统计对话框中计算百分比
10final count = stats[mood] ?? 0;
11final total = _diaries.length;
12final percentage = total > 0
13    ? (count / total * 100).toStringAsFixed(1)
14    : '0.0';
15

3.4 今日心情计算

3.4.1 计算流程

获取今日日期

筛选今日日记

今日是否有日记?

统计各心情出现次数

返回null

找出出现最多的心情

返回今日心情

3.4.2 计算实现
1Widget _buildMoodSummary() {
2  final today = DateTime.now();
3  final todayDiaries = _diaries
4      .where((d) =>
5          d.date.year == today.year &&
6          d.date.month == today.month &&
7          d.date.day == today.day)
8      .toList();
9
10  MoodType? todayMood;
11  if (todayDiaries.isNotEmpty) {
12    final moodCounts = <MoodType, int>{};
13    for (var d in todayDiaries) {
14      moodCounts[d.mood] = (moodCounts[d.mood] ?? 0) + 1;
15    }
16    todayMood = moodCounts.entries
17        .reduce((a, b) => a.value > b.value ? a : b)
18        .key;
19  }
20  // ...
21}
22

3.5 页面结构设计

3.5.1 列表页面布局

列表页面

AppBar

心情概览卡片

搜索栏

日记卡片列表

浮动按钮

标题: 心情日记

统计按钮

筛选菜单

今日心情图标

今日心情文字

日记总数

日记卡片1

日记卡片2

...

3.5.2 编辑页面布局
1┌─────────────────────────────────────────────────────────────┐
2  AppBar: 写日记/编辑日记                          [💾 保存] 
3├─────────────────────────────────────────────────────────────┤
4  今天的心情                                                  
5  ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐  
6   😊   😢   😠   😰   😌   🤩   😴   🙏   
7  │开心│ │难过│ │愤怒│ │焦虑│ │平静│ │兴奋│ │疲惫│ │感恩│  
8  └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘  
9                                                             
10  📝 日记标题 *                                              
11  ┌─────────────────────────────────────────────────────┐   
12                                                          
13  └─────────────────────────────────────────────────────┘   
14                                                             
15  📅 日期                                                    
16  ┌─────────────────────────────────────────────────────┐   
17   2024-01-15                                             
18  └─────────────────────────────────────────────────────┘   
19                                                             
20  📍 地点                              ☀️ 天气              
21  ┌──────────────────────┐  ┌──────────────────────┐        
22                                                        
23  └──────────────────────┘  └──────────────────────┘        
24                                                             
25  📋 日记内容 *                                              
26  ┌─────────────────────────────────────────────────────┐   
27                多行文本输入                               
28                                                          
29  └─────────────────────────────────────────────────────┘   
30                                                             
31  标签: [朋友] [户外] [×]                                    
32└─────────────────────────────────────────────────────────────┘
33

3.6 状态管理

3.6.1 核心状态变量
1class _MoodDiaryPageState extends State<MoodDiaryPage> {
2  final List<MoodDiary> _diaries = [];   // 所有日记
3  String _searchQuery = '';               // 搜索关键词
4  MoodType? _selectedMood;                // 选中的心情筛选
5}
6
7class _MoodDiaryEditPageState extends State<MoodDiaryEditPage> {
8  late MoodType _selectedMood;            // 选中的心情
9  late DateTime _selectedDate;            // 选中的日期
10  late List<String> _tags;                // 标签列表
11}
12
3.6.2 状态更新流程
1// 添加日记
2void _addDiary() async {
3  final result = await Navigator.push<MoodDiary>(
4    context,
5    MaterialPageRoute(builder: (context) => const MoodDiaryEditPage()),
6  );
7
8  if (result != null) {
9    setState(() {
10      _diaries.insert(0, result);
11    });
12  }
13}
14
15// 删除日记
16void _deleteDiary(MoodDiary diary) {
17  setState(() {
18    _diaries.removeWhere((d) => d.id == diary.id);
19  });
20}
21

四、UI设计规范

4.1 配色方案

应用采用粉色主题风格,体现温馨的情感氛围:

颜色类型色值用途
主色PinkAppBar、按钮、强调
开心Yellow开心心情标识
难过Blue难过心情标识
愤怒Red愤怒心情标识
焦虑Purple焦虑心情标识
平静Green平静心情标识
兴奋Orange兴奋心情标识
疲惫Grey疲惫心情标识
感恩Pink感恩心情标识

4.2 心情类型样式

4.2.1 心情选择器
心情表情颜色选中效果
开心😊黄色黄色背景 + 黄色边框
难过😢蓝色蓝色背景 + 蓝色边框
愤怒😠红色红色背景 + 红色边框
焦虑😰紫色紫色背景 + 紫色边框
平静😌绿色绿色背景 + 绿色边框
兴奋🤩橙色橙色背景 + 橙色边框
疲惫😴灰色灰色背景 + 灰色边框
感恩🙏粉色粉色背景 + 粉色边框
4.2.2 心情卡片图标
1┌─────────────────┐
2   😊               心情表情
3                 
4   彩色圆角背景      心情对应颜色
5└─────────────────┘
6

4.3 组件规范

4.3.1 日记卡片
1┌─────────────────────────────────────────────────────────────┐
2  ┌────┐  美好的一天                                         
3   😊   2024-01-15                                          
4  └────┘                                                      
5  今天阳光明媚,和朋友一起去了公园野餐。大家聊得很开心...      
6                                                              
7  📍 中央公园  ☀️ 晴天  [朋友] [户外]                         
8└─────────────────────────────────────────────────────────────┘
9
4.3.2 心情概览卡片
1┌─────────────────────────────────────────────────────────────┐
2  ┌────┐  今日心情                    ┌────┐                
3   😊   开心                         15                 
4                                    │篇日记│               
5  └────┘                              └────┘                
6└─────────────────────────────────────────────────────────────┘
7
4.3.3 统计对话框
1┌─────────────────────────────────────────┐
2  心情统计                          [×]  
3├─────────────────────────────────────────┤
4  😊 开心      5篇 (33.3%)               
5  ████████████░░░░░░░░░░░░░░░░░░░░░░░░░  
6                                         
7  😢 难过      2篇 (13.3%)               
8  █████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  
9                                         
10  😌 平静      3篇 (20.0%)               
11  ████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  
12  ...                                    
13├─────────────────────────────────────────┤
14                              [关闭]     
15└─────────────────────────────────────────┘
16

4.4 交互设计

4.4.1 操作方式
操作手势效果
查看详情点击卡片跳转详情页
新建日记点击浮动按钮跳转编辑页
编辑日记点击菜单-编辑跳转编辑页
删除日记点击菜单-删除确认后删除
搜索输入关键词实时过滤
筛选点击筛选图标选择心情类型
统计点击统计图标显示统计对话框
4.4.2 心情选择交互
1未选中状态:  ┌────────┐
2               😊     灰色背景
3              开心  
4            └────────┘
5
6选中状态:    ┌────────┐
7               😊     黄色背景 + 黄色边框
8              开心  
9            └────────┘
10

五、核心功能实现

5.1 列表页面构建

1
2Widget build(BuildContext context) {
3  return Scaffold(
4    appBar: AppBar(
5      title: const Text('心情日记'),
6      actions: [
7        IconButton(
8          icon: const Icon(Icons.bar_chart),
9          onPressed: _showStatistics,
10        ),
11        PopupMenuButton<MoodType?>(
12          icon: const Icon(Icons.filter_list),
13          onSelected: (value) {
14            setState(() {
15              _selectedMood = value;
16            });
17          },
18          itemBuilder: (context) => [
19            const PopupMenuItem(value: null, child: Text('全部心情')),
20            ...MoodType.values.map((mood) => PopupMenuItem(
21              value: mood,
22              child: Text(moodEmoji + ' ' + moodText),
23            )),
24          ],
25        ),
26      ],
27    ),
28    body: Column(
29      children: [
30        _buildMoodSummary(),
31        _buildSearchBar(),
32        Expanded(
33          child: _filteredDiaries.isEmpty
34              ? _buildEmptyState()
35              : _buildDiariesList(),
36        ),
37      ],
38    ),
39    floatingActionButton: FloatingActionButton(
40      onPressed: _addDiary,
41      child: const Icon(Icons.add),
42    ),
43  );
44}
45

5.2 心情选择器

1Wrap(
2  spacing: 12,
3  runSpacing: 12,
4  children: MoodType.values.map((mood) {
5    final isSelected = _selectedMood == mood;
6    final tempDiary = MoodDiary(
7      id: '', title: '', content: '',
8      mood: mood, date: DateTime.now(),
9      createdAt: DateTime.now(), updatedAt: DateTime.now(),
10    );
11    return GestureDetector(
12      onTap: () {
13        setState(() {
14          _selectedMood = mood;
15        });
16      },
17      child: Container(
18        padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
19        decoration: BoxDecoration(
20          color: isSelected
21              ? tempDiary.moodColor.withValues(alpha: 0.2)
22              : Colors.grey.shade100,
23          borderRadius: BorderRadius.circular(16),
24          border: Border.all(
25            color: isSelected ? tempDiary.moodColor : Colors.transparent,
26            width: 2,
27          ),
28        ),
29        child: Column(
30          children: [
31            Text(tempDiary.moodEmoji, style: const TextStyle(fontSize: 28)),
32            const SizedBox(height: 4),
33            Text(tempDiary.moodText),
34          ],
35        ),
36      ),
37    );
38  }).toList(),
39)
40

5.3 标签管理

1void _addTag() {
2  if (_tagController.text.isNotEmpty &&
3      !_tags.contains(_tagController.text)) {
4    setState(() {
5      _tags.add(_tagController.text);
6      _tagController.clear();
7    });
8  }
9}
10
11void _removeTag(String tag) {
12  setState(() {
13    _tags.remove(tag);
14  });
15}
16
17// 标签显示
18Wrap(
19  spacing: 8,
20  runSpacing: 8,
21  children: _tags.map((tag) {
22    return Chip(
23      label: Text(tag),
24      onDeleted: () => _removeTag(tag),
25      deleteIcon: const Icon(Icons.close, size: 16),
26    );
27  }).toList(),
28)
29

5.4 心情统计对话框

1void _showStatistics() {
2  final stats = _moodStats;
3  showDialog(
4    context: context,
5    builder: (context) {
6      return AlertDialog(
7        title: const Text('心情统计'),
8        content: SizedBox(
9          width: 300,
10          child: Column(
11            mainAxisSize: MainAxisSize.min,
12            children: MoodType.values.map((mood) {
13              final count = stats[mood] ?? 0;
14              final total = _diaries.length;
15              final percentage = total > 0
16                  ? (count / total * 100).toStringAsFixed(1)
17                  : '0.0';
18              return Row(
19                children: [
20                  Text(moodEmoji, style: const TextStyle(fontSize: 24)),
21                  const SizedBox(width: 8),
22                  Expanded(
23                    child: Column(
24                      children: [
25                        Row(
26                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
27                          children: [
28                            Text(moodText),
29                            Text('$count ($percentage%)'),
30                          ],
31                        ),
32                        LinearProgressIndicator(
33                          value: total > 0 ? count / total : 0,
34                          backgroundColor: Colors.grey.shade200,
35                          valueColor: AlwaysStoppedAnimation(moodColor),
36                        ),
37                      ],
38                    ),
39                  ),
40                ],
41              );
42            }).toList(),
43          ),
44        ),
45        actions: [
46          TextButton(
47            onPressed: () => Navigator.pop(context),
48            child: const Text('关闭'),
49          ),
50        ],
51      );
52    },
53  );
54}
55

5.5 表单验证与保存

1void _save() {
2  if (_formKey.currentState!.validate()) {
3    final now = DateTime.now();
4
5    final diary = MoodDiary(
6      id: widget.diary?.id ?? DateTime.now().millisecondsSinceEpoch.toString(),
7      title: _titleController.text,
8      content: _contentController.text,
9      mood: _selectedMood,
10      date: _selectedDate,
11      location: _locationController.text,
12      weather: _weatherController.text,
13      tags: _tags,
14      createdAt: widget.diary?.createdAt ?? now,
15      updatedAt: now,
16    );
17
18    Navigator.pop(context, diary);
19  }
20}
21

六、心情类型知识拓展

6.1 心情分类体系

心情类型

正向情绪

负向情绪

中性情绪

开心 😊

兴奋 🤩

感恩 🙏

难过 😢

愤怒 😠

焦虑 😰

平静 😌

疲惫 😴

6.2 心情与色彩心理学

心情颜色心理学含义
开心黄色温暖、活力、乐观
难过蓝色冷静、深沉、忧郁
愤怒红色热情、力量、警示
焦虑紫色神秘、敏感、不安
平静绿色自然、和谐、安宁
兴奋橙色活力、创意、热情
疲惫灰色中性、低调、休息
感恩粉色温柔、爱意、感激

6.3 心情记录的意义

心情记录

自我觉察

情绪管理

心理健康

了解情绪模式

发现触发因素

及时调整心态

寻求适当帮助

预防心理问题

提升生活质量


七、扩展功能规划

7.1 后续版本规划

2024-01-07 2024-01-14 2024-01-21 2024-01-28 2024-02-04 2024-02-11 2024-02-18 2024-02-25 2024-03-03 2024-03-10 2024-03-17 核心记录功能 心情统计功能 搜索筛选功能 数据持久化 心情趋势图 导出功能 提醒功能 密码保护 云同步功能 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 心情日记应用开发计划

7.2 功能扩展建议

7.2.1 数据持久化
功能说明
SQLite存储本地数据库存储日记
数据备份支持数据导出备份
数据恢复支持数据导入恢复
7.2.2 心情趋势分析
功能说明
折线图展示心情变化趋势
热力图展示心情分布密度
月度报告生成心情分析报告
7.2.3 智能功能
功能说明
心情提醒定时提醒记录心情
AI分析智能情绪识别建议
关联分析分析心情与天气/地点关联

八、注意事项

8.1 开发注意事项

  1. 心情颜色处理:使用 withValues(alpha:) 替代已废弃的 withOpacity()
  2. 日期格式化:统一使用 yyyy-MM-dd 格式
  3. 表单验证:标题和内容为必填字段
  4. 状态更新:使用 setState 触发界面刷新

8.2 用户体验优化

💡 用户体验建议 💡

  • 心情选择直观便捷
  • 日记记录简洁高效
  • 统计展示清晰明了
  • 搜索筛选快速精准

8.3 常见问题

问题原因解决方案
心情颜色不显示颜色值错误检查moodColor getter
统计百分比错误总数为0添加总数判断
搜索无结果过滤条件错误检查过滤逻辑
日期显示异常格式化错误统一日期格式

九、运行说明

9.1 环境要求

环境版本要求
Flutter SDK>= 3.0.0
Dart SDK>= 2.17.0
鸿蒙OSAPI 21+

9.2 运行命令

1# 查看可用设备
2flutter devices
3
4# 运行到鸿蒙设备
5flutter run -d 127.0.0.1:5555 lib/main_mood_diary.dart
6
7# 运行到Windows
8flutter run -d windows -t lib/main_mood_diary.dart
9
10# 代码分析
11flutter analyze lib/main_mood_diary.dart
12

十、总结

心情日记应用通过完善的功能设计,帮助用户记录和管理每日心情。应用支持八种心情类型,配以表情符号与主题色彩,让情绪表达更加直观生动。日记撰写支持标题、内容、日期、地点、天气等全方位记录,标签管理功能让日记分类更加灵活。

心情统计功能可视化展示各心情占比,帮助用户洞察情绪规律。今日心情功能自动计算当天主要心情状态,让用户快速了解当日情绪。搜索和筛选功能让用户快速定位目标日记,提高管理效率。

界面设计采用粉色主题风格,体现温馨的情感氛围。心情选择器采用彩色卡片设计,选中状态清晰明了。应用采用Material Design 3设计规范,遵循Flutter最佳实践,代码结构清晰,易于维护和扩展。

**记录心情,感悟生活,关爱自己,从心开始!


Flutter 框架跨平台鸿蒙开发 - 跟生活有关的心情日记应用开发》 是转载文章,点击查看原文


相关推荐


第12章 I2C通信协议全解:底层时序、主从机通信与AT24C02、MPU6050传感器实战
是翔仔呐2026/3/29

前言 上一章我们通过硬件I2C完成了OLED屏的驱动开发,实现了字符与图像的显示,但未深入拆解I2C协议的底层逻辑。I2C是工业嵌入式开发中最常用的低速串行总线,是传感器、存储芯片、显示外设的核心通信方式。对应51单片机开发,我们通常通过软件翻转IO口模拟I2C时序,存在时序精度差、CPU占用率100%、多从机兼容性差、无硬件错误处理的痛点;而STM32内置硬件I2C控制器,可自动生成标准时序、处理应答机制、支持DMA高速传输,完美适配工业场景多设备、高稳定性的通信需求。新手入门I2C普遍面临三


【Kotlin】 数据流完全指南:冷流、热流与 Android 实战
idealzouhu2026/3/21

文章目录 一、数据流简介1.1 Kotlin 数据流概述1.2 核心特性1.3 Flow 的基本组件 二、数据流的使用方法2.1 正向流2.1.1 创建数据流2.1.2 修改数据流2.1.3 收集数据流 2.2 反向流2.2.1 创建数据流2.2.2 修改并收集数据流 2.3 数据流在 Jetpack 中的应用场景 三、数据流的行为模式3.1 冷流(Cold Flow)3.1.1 什么是冷流3.1.2 为什么 Kotlin 默认使用冷流 3.2 热流(Hot


特高压输变电工程全生命周期BIM+GIS数字化管理平台:重塑能源动脉的数字基石(WORD)
无忧智库2026/3/13

引言:能源互联网时代的数字化觉醒 在“双碳”目标的宏大叙事下,中国能源结构正经历着前所未有的深刻变革。作为能源配置的“大动脉”,特高压输变电工程以其输送容量大、距离远、损耗低的技术优势,成为了构建新型电力系统的核心骨架。然而,随着工程规模的指数级增长和地理环境的日益复杂,传统的管理模式正面临着严峻的挑战。设计阶段的各专业协同困难、施工阶段的进度与质量管控盲区、运维阶段的海量数据孤岛,如同一个个隐形的枷锁,制约着电网建设效率的提升和全生命周期价值的释放。 当物理世界的铁塔银线不断向天际延伸时,数字


windows下配置Qt arm32交叉编译环境
itas1092026/3/5

windows下配置Qt arm32交叉编译环境 环境: 系统:windows 11 Qt: 5.12.12(2021-11-25) 本地编译器:mingw73 64(2018-04-25) 交叉编译器: gcc-linaro-7.3.1-2018.05-i686-mingw32_arm-linux-gnueabi perl: strawberry perl 5.22.1(2016-01-07) python: 3.8.10(2021-05-03) 1. 安装Qt MinGW Perl Pyt


告别死板流程:OpenSpec OPSX 如何重塑 SDD 开发工作流
fundroid2026/2/25

引言:SDD 与 OpenSpec 规范驱动开发(SDD)是什么? 近两年,AI 编码助手已经能“听懂人话”,从一段自然语言描述里生成大段代码。但很多团队也发现:如果需求只是散落在聊天记录里、脑补在每个人的心里,AI 很容易“发挥过度”——代码写出来了,却不是你真正想要的系统行为。 规范驱动开发(Spec-Driven Development,SDD)试图解决的,就是这个问题。它把规范(spec)而不是代码当成系统的“单一事实来源”:先用结构化、机器可读的方式,把系统应该做什么、有哪些边界和不变


WebMCP 时代:在浏览器中释放 AI 的工作能力
CharlesYu012026/2/16

随着 AI Agent 的广泛应用,传统的 Web 自动化与 Web 交互模式正在迎来根本性变化。WebMCP 是一个未来派的技术提案,它不仅改变了 AI 访问 Web 的方式,还为 AI 与前端应用之间建立起了 协议级的交互通道。本文从WebMCP架构分层解析这项技术及其工程意义。 面对 GEO 与 Agent 应用逐步弱化浏览器入口价值的趋势,浏览器厂商必须主动跟进,通过技术升级与生态重构来守住自身核心阵地。 一、WebMCP 是什么? WebMCP(Web Model Context P


MCP (Model Context Protocol) 技术理解 - 第二篇
想用offer打牌2026/2/8

引言 我们第一篇讲了MCP的基础概念、MCP解决的问题以及MCP的架构,我相信大家已经对MCP有了一定的了解,那么接下来让我们深入MCP具体是如何实现的,这一篇我们的重点放在通信协议和数据传输上,让我们一起来看看吧 如果你对前面的内容感兴趣,可以点击这里跳转 MCP (Model Context Protocol) 技术理解 - 第一篇 MCP的层级 MCP由两层组成: 数据层:定义了基于 JSON-RPC 的客户端-服务器通信协议,包括生命周期管理和核心原语,如工具、资源、提示和通知。 传输


type-challenges(ts类型体操): 11 - 元组转换为对象
fxss2026/1/30

11 - 元组转换为对象 by sinoon (@sinoon) #简单 #object-keys 题目 将一个元组类型转换为对象类型,这个对象类型的键/值和元组中的元素对应。 例如: const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const type result = TupleToObject<typeof tuple> // expected { 'tesla': 'tesla', 'model 3': 'mode


Flutter艺术探索-Flutter国际化:多语言支持实现
kirk_wang2026/1/20

Flutter 国际化:从原理到实践的多语言支持方案 引言:为什么你的 Flutter 应用需要国际化? 如今,开发一款成功的应用就不得不考虑全球市场。国际化(i18n)和本地化(l10n)不再是可选项,而是连接不同文化用户的桥梁。对于使用 Flutter 的开发者来说,框架本身提供了强大的国际化支持,这不仅能显著提升用户体验,更是扩大应用市场份额的关键一步。想想看,当你的应用能够用用户的母语与其沟通时,下载量和用户留存率的提升是显而易见的。 Flutter 的国际化体系基于 Dart 的 in


mongodb的基本命令
豆浆粉牛奶2026/1/12

大家好我是小帅,今天学习mongodb的简单认识和基本命令。 本章内容: 理解MongoDB的业务场景、熟悉MongoDB的简介、特点和体系结构、数据类型等。能够在Windows和Linux下安装和启动MongoDB、图形化管理界面Compass的安装使用掌握MongoDB基本常用命令实现数据的CRUD 掌握MongoDB的索引类型、索引管理、执行计划。使用Spring DataMongoDB完成文章评论业务的开发 文章目录 1. MongoDB认识1.1 业务场景1.2 结构体系

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客