Flutter 框架跨平台鸿蒙开发 - 智能植物生长记录应用
摘要: 智能植物生长记录应用是一款基于Flutter开发的跨平台植物养护工具,支持鸿蒙OS和Web平台。应用提供拍照记录、数据测量、观察日记、生长曲线可视化等功能,内置智能分析引擎可自动识别植物生长阶段。系统采用分层架构设计,包含表现层、业务层和数据层,支持6种植物类型和6个生长阶段的分类管理。技术栈包括Flutter 3.0、Dart 2.17和Material Design 3规范,使用Pro
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
一、项目概述
运行效果图




1.1 应用简介
智能植物生长记录是一款专业的植物生长管理工具应用,通过拍照记录、数据测量、观察日记等功能,全方位记录植物的生长过程。应用内置智能分析引擎,支持生长曲线可视化、生长阶段识别,还能与植物爱好者社区交流分享,让植物养护更加科学有趣。
应用以清新的绿色为主色调,象征生机与活力。涵盖生长记录、数据测量、观察日记、社区交流四大模块。用户可以拍照记录生长状态、测量植物高度叶片、撰写观察日记、分享养护经验,让每一株植物的成长历程都被完整记录。
1.2 核心功能
| 功能模块 | 功能描述 | 实现方式 |
|---|---|---|
| 拍照记录 | 定期拍照记录生长状态 | 相机集成 |
| 数据测量 | 高度、叶片数、茎粗测量 | 手动输入 |
| 观察日记 | 文字记录观察心得 | 文本编辑 |
| 生长曲线 | 可视化生长数据趋势 | 图表绘制 |
| 阶段识别 | 自动识别生长阶段 | 规则引擎 |
| 提醒功能 | 浇水、施肥、修剪提醒 | 定时任务 |
| 社区分享 | 分享植物成长故事 | 社交功能 |
| 经验交流 | 与植物爱好者互动 | 评论系统 |
1.3 植物类型定义
| 序号 | 植物类型 | Emoji | 描述 |
|---|---|---|---|
| 1 | 观叶植物 | 🌿 | 绿萝、龟背竹、发财树等 |
| 2 | 开花植物 | 🌸 | 玫瑰、茉莉、栀子花等 |
| 3 | 多肉植物 | 🌵 | 仙人掌、景天、芦荟等 |
| 4 | 蔬菜水果 | 🥬 | 番茄、辣椒、草莓等 |
| 5 | 草本植物 | 🌱 | 薄荷、罗勒、迷迭香等 |
| 6 | 水培植物 | 💧 | 绿萝、富贵竹、铜钱草等 |
1.4 生长阶段定义
| 序号 | 阶段名称 | Emoji | 天数范围 | 描述 |
|---|---|---|---|---|
| 1 | 种子期 | 🌱 | 0-7天 | 播种发芽阶段 |
| 2 | 幼苗期 | 🌿 | 8-30天 | 初步生长阶段 |
| 3 | 生长期 | 🌳 | 31-90天 | 快速生长阶段 |
| 4 | 成熟期 | 🌻 | 91-180天 | 稳定生长阶段 |
| 5 | 开花期 | 🌸 | 视品种 | 开花结果阶段 |
| 6 | 休眠期 | 🍂 | 视品种 | 冬季休眠阶段 |
1.5 测量指标定义
| 序号 | 指标名称 | Emoji | 单位 | 测量频率 |
|---|---|---|---|---|
| 1 | 植株高度 | 📏 | 厘米 | 每周 |
| 2 | 叶片数量 | 🍃 | 片 | 每周 |
| 3 | 茎粗 | 📐 | 毫米 | 每两周 |
| 4 | 叶片长度 | 🌿 | 厘米 | 每周 |
| 5 | 花苞数量 | 🌸 | 个 | 开花期 |
| 6 | 果实数量 | 🍎 | 个 | 结果期 |
1.6 养护提醒定义
| 序号 | 提醒类型 | Emoji | 频率 | 描述 |
|---|---|---|---|---|
| 1 | 浇水提醒 | 💧 | 视品种 | 保持土壤湿润 |
| 2 | 施肥提醒 | 🌱 | 每月 | 补充营养 |
| 3 | 修剪提醒 | ✂️ | 每季 | 整理株型 |
| 4 | 换盆提醒 | 🪴 | 每年 | 更换盆土 |
| 5 | 防虫提醒 | 🐛 | 每月 | 检查病虫害 |
| 6 | 光照提醒 | ☀️ | 每日 | 调整光照位置 |
1.7 技术栈
| 技术领域 | 技术选型 | 版本要求 |
|---|---|---|
| 开发框架 | Flutter | >= 3.0.0 |
| 编程语言 | Dart | >= 2.17.0 |
| 设计规范 | Material Design 3 | - |
| 状态管理 | Provider | >= 6.0.0 |
| 数据存储 | SharedPreferences | >= 2.0.0 |
| 图表库 | FL Chart | >= 0.55.0 |
| 图片选择 | Image Picker | >= 0.8.0 |
| 目标平台 | 鸿蒙OS / Web | API 21+ |
1.8 项目结构
lib/
└── main_plant_growth_tracker.dart
├── PlantGrowthTrackerApp # 应用入口
├── PlantType # 植物类型枚举
├── GrowthStage # 生长阶段枚举
├── ReminderType # 提醒类型枚举
├── Plant # 植物模型
├── GrowthRecord # 生长记录模型
├── Observation # 观察日记模型
├── Measurement # 测量数据模型
├── CommunityPost # 社区帖子模型
├── PlantGrowthTrackerHomePage # 主页面(底部导航)
├── _buildRecordPage # 记录页面
├── _buildDataPage # 数据页面
├── _buildDiaryPage # 日记页面
├── _buildCommunityPage # 社区页面
├── GrowthCurvePainter # 生长曲线绘制器
└── PlantCardPainter # 植物卡片绘制器
二、系统架构
2.1 整体架构图
2.2 类图设计
2.3 页面导航流程
2.4 生长记录流程
三、核心模块设计
3.1 数据模型设计
3.1.1 植物类型枚举 (PlantType)
enum PlantType {
foliage(label: '观叶植物', emoji: '🌿', description: '绿萝、龟背竹、发财树等'),
flowering(label: '开花植物', emoji: '🌸', description: '玫瑰、茉莉、栀子花等'),
succulent(label: '多肉植物', emoji: '🌵', description: '仙人掌、景天、芦荟等'),
vegetable(label: '蔬菜水果', emoji: '🥬', description: '番茄、辣椒、草莓等'),
herb(label: '草本植物', emoji: '🌱', description: '薄荷、罗勒、迷迭香等'),
hydroponic(label: '水培植物', emoji: '💧', description: '绿萝、富贵竹、铜钱草等');
final String label;
final String emoji;
final String description;
}
3.1.2 生长阶段枚举 (GrowthStage)
enum GrowthStage {
seed(label: '种子期', emoji: '🌱', minDays: 0, maxDays: 7),
seedling(label: '幼苗期', emoji: '🌿', minDays: 8, maxDays: 30),
growth(label: '生长期', emoji: '🌳', minDays: 31, maxDays: 90),
mature(label: '成熟期', emoji: '🌻', minDays: 91, maxDays: 180),
flowering(label: '开花期', emoji: '🌸', minDays: 0, maxDays: 0),
dormant(label: '休眠期', emoji: '🍂', minDays: 0, maxDays: 0);
final String label;
final String emoji;
final int minDays;
final int maxDays;
}
3.1.3 植物模型 (Plant)
class Plant {
final String id; // 植物ID
final String name; // 植物名称
final PlantType type; // 植物类型
final String variety; // 品种
final DateTime plantDate; // 种植日期
final String location; // 位置
final String avatar; // 头像路径
final GrowthStage currentStage; // 当前阶段
final DateTime createdAt; // 创建时间
}
3.1.4 生长记录模型 (GrowthRecord)
class GrowthRecord {
final String id; // 记录ID
final String plantId; // 植物ID
final DateTime recordDate; // 记录日期
final String photoPath; // 照片路径
final double height; // 高度(厘米)
final int leafCount; // 叶片数量
final double stemDiameter; // 茎粗(毫米)
final double leafLength; // 叶片长度(厘米)
final int flowerBuds; // 花苞数量
final int fruits; // 果实数量
final String notes; // 备注
}
3.1.5 植物类型分布
3.2 页面结构设计
3.2.1 主页面布局
3.2.2 记录页结构
3.2.3 数据页结构
3.2.4 社区页结构
3.3 生长分析逻辑
3.4 社区交流逻辑
四、UI设计规范
4.1 配色方案
应用以清新的绿色为主色调,象征生机与活力:
| 颜色类型 | 色值 | 用途 |
|---|---|---|
| 主色 | #4CAF50 (Green) | 导航、主题元素 |
| 辅助色 | #66BB6A | 记录页面 |
| 第三色 | #81C784 | 数据页面 |
| 强调色 | #A5D6A7 | 日记页面 |
| 背景色 | #FAFAFA | 页面背景 |
| 卡片背景 | #FFFFFF | 信息卡片 |
| 警告色 | #FF9800 | 提醒通知 |
| 成功色 | #4CAF50 | 操作成功 |
4.2 生长阶段配色
| 阶段 | 色值 | 视觉效果 |
|---|---|---|
| 种子期 | #8BC34A | 浅绿色 |
| 幼苗期 | #4CAF50 | 嫩绿色 |
| 生长期 | #388E3C | 深绿色 |
| 成熟期 | #2E7D32 | 墨绿色 |
| 开花期 | #E91E63 | 粉红色 |
| 休眠期 | #795548 | 棕色 |
4.3 字体规范
| 元素 | 字号 | 字重 | 颜色 |
|---|---|---|---|
| 页面标题 | 24px | Bold | 主色 |
| 植物名称 | 18px | Bold | #000000 |
| 数据数值 | 20px | Bold | 主色 |
| 日记标题 | 16px | Bold | #000000 |
| 日记内容 | 14px | Regular | #333333 |
| 提示文字 | 12px | Regular | #666666 |
4.4 组件规范
4.4.1 植物卡片
┌─────────────────────────────────────┐
│ 我的植物 │
│ │
│ ┌─────────────────────────────┐ │
│ │ 🌿 绿萝 │ │
│ │ │ │
│ │ 种植: 2024-01-01 │ │
│ │ 阶段: 🌳 生长期 │ │
│ │ 高度: 45cm │ │
│ │ 叶片: 28片 │ │
│ │ │ │
│ │ [记录] [数据] [日记] │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
4.4.2 生长曲线卡
┌─────────────────────────────────────┐
│ 生长曲线 │
│ │
│ 高度变化 │
│ ━━━━━━━━━━━━━━━━━━━━━━ │
│ 📈 30天增长: +15cm │
│ 📊 平均增长率: 0.5cm/天 │
│ │
│ 叶片数量 │
│ ━━━━━━━━━━━━━━━━━━━━━━ │
│ 📈 30天增加: +8片 │
│ 📊 平均增长率: 0.27片/天 │
└─────────────────────────────────────┘
4.4.3 观察日记卡
┌─────────────────────────────────────┐
│ 观察日记 │
│ │
│ 📅 2024-03-15 ☀️ 晴天 │
│ │
│ 标题: 绿萝长出新叶啦! │
│ │
│ 今天发现绿萝又长出了两片新叶, │
│ 颜色很嫩绿,看起来很健康。最近 │
│ 天气转暖,应该多给它晒晒太阳... │
│ │
│ [📷 2张照片] │
│ │
│ 💚 12 💬 3 │
└─────────────────────────────────────┘
4.4.4 测量表单
┌─────────────────────────────────────┐
│ 数据测量 │
│ │
│ 记录日期: [2024-03-15 ▼] │
│ │
│ 植株高度: ──────●──────── 45cm │
│ │
│ 叶片数量: ─────●───────── 28片 │
│ │
│ 茎粗: ────●──────────── 5.2mm │
│ │
│ 备注: │
│ ┌─────────────────────────────┐ │
│ │ │ │
│ └─────────────────────────────┘ │
│ │
│ [保存记录] │
└─────────────────────────────────────┘
4.4.5 社区帖子卡
┌─────────────────────────────────────┐
│ 👤 小明 🌿 绿萝 │
│ 2024-03-15 │
│ │
│ 我的绿萝终于开花了! │
│ │
│ 养了三年的绿萝,今天终于看到花 │
│ 苞了,太开心了!分享给大家看看... │
│ │
│ [📷 照片预览] │
│ │
│ 💚 128 💬 32 ⭐ 收藏 │
└─────────────────────────────────────┘
五、核心功能实现
5.1 生长曲线绘制实现
class GrowthCurvePainter extends CustomPainter {
final List<double> heightData;
final List<DateTime> dates;
final Color color;
void paint(Canvas canvas, Size size) {
if (heightData.isEmpty || heightData.length < 2) return;
final path = Path();
final stepX = size.width / (heightData.length - 1);
final maxVal = heightData.reduce(max);
final minVal = heightData.reduce(min);
final range = maxVal - minVal == 0 ? 1.0 : maxVal - minVal;
// 绘制曲线
for (int i = 0; i < heightData.length; i++) {
final x = i * stepX;
final y = size.height - ((heightData[i] - minVal) / range) * size.height;
if (i == 0) {
path.moveTo(x, y);
} else {
path.lineTo(x, y);
}
}
final paint = Paint()
..color = color
..style = PaintingStyle.stroke
..strokeWidth = 3;
canvas.drawPath(path, paint);
// 绘制数据点
for (int i = 0; i < heightData.length; i++) {
final x = i * stepX;
final y = size.height - ((heightData[i] - minVal) / range) * size.height;
canvas.drawCircle(
Offset(x, y),
4,
Paint()..color = color,
);
}
}
}
5.2 阶段识别实现
class StageDetector {
GrowthStage detectStage(DateTime plantDate, DateTime currentDate) {
final days = currentDate.difference(plantDate).inDays;
if (days <= 7) {
return GrowthStage.seed;
} else if (days <= 30) {
return GrowthStage.seedling;
} else if (days <= 90) {
return GrowthStage.growth;
} else if (days <= 180) {
return GrowthStage.mature;
} else {
return GrowthStage.mature;
}
}
double calculateStageProgress(DateTime plantDate, DateTime currentDate, GrowthStage stage) {
final days = currentDate.difference(plantDate).inDays;
if (stage.maxDays == 0) return 1.0;
final stageDays = days - stage.minDays;
final stageDuration = stage.maxDays - stage.minDays;
return (stageDays / stageDuration).clamp(0.0, 1.0);
}
}
5.3 生长分析实现
class GrowthAnalyzer {
GrowthAnalysis analyzeGrowth(List<GrowthRecord> records) {
if (records.length < 2) {
return GrowthAnalysis(
averageGrowthRate: 0,
maxHeight: 0,
minHeight: 0,
totalGrowth: 0,
);
}
final sortedRecords = records..sort((a, b) => a.recordDate.compareTo(b.recordDate));
final firstHeight = sortedRecords.first.height;
final lastHeight = sortedRecords.last.height;
final totalGrowth = lastHeight - firstHeight;
final days = sortedRecords.last.recordDate
.difference(sortedRecords.first.recordDate)
.inDays;
final averageGrowthRate = days > 0 ? totalGrowth / days : 0.0;
final heights = records.map((r) => r.height).toList();
final maxHeight = heights.reduce(max);
final minHeight = heights.reduce(min);
return GrowthAnalysis(
averageGrowthRate: averageGrowthRate,
maxHeight: maxHeight,
minHeight: minHeight,
totalGrowth: totalGrowth,
);
}
}
5.4 提醒管理实现
class ReminderManager {
List<PlantReminder> generateReminders(Plant plant) {
List<PlantReminder> reminders = [];
// 浇水提醒
reminders.add(PlantReminder(
type: ReminderType.water,
plantId: plant.id,
nextDate: _calculateNextWaterDate(plant.type),
message: '该给${plant.name}浇水啦!',
));
// 施肥提醒
reminders.add(PlantReminder(
type: ReminderType.fertilize,
plantId: plant.id,
nextDate: _calculateNextFertilizeDate(plant.type),
message: '该给${plant.name}施肥啦!',
));
// 修剪提醒
reminders.add(PlantReminder(
type: ReminderType.prune,
plantId: plant.id,
nextDate: _calculateNextPruneDate(plant.type),
message: '该给${plant.name}修剪啦!',
));
return reminders;
}
DateTime _calculateNextWaterDate(PlantType type) {
int interval;
switch (type) {
case PlantType.succulent:
interval = 7;
break;
case PlantType.hydroponic:
interval = 3;
break;
default:
interval = 2;
}
return DateTime.now().add(Duration(days: interval));
}
}
5.5 记录保存实现
void _saveRecord() {
setState(() {
_isSaving = true;
});
final record = GrowthRecord(
id: 'record_${DateTime.now().millisecondsSinceEpoch}',
plantId: _currentPlant.id,
recordDate: DateTime.now(),
photoPath: _photoPath,
height: _height,
leafCount: _leafCount,
stemDiameter: _stemDiameter,
leafLength: _leafLength,
flowerBuds: _flowerBuds,
fruits: _fruits,
notes: _notes,
);
_growthRecords.insert(0, record);
// 分析生长数据
final analysis = _growthAnalyzer.analyzeGrowth(_growthRecords);
// 更新植物阶段
final newStage = _stageDetector.detectStage(
_currentPlant.plantDate,
DateTime.now(),
);
setState(() {
_isSaving = false;
_currentPlant = _currentPlant.copyWith(currentStage: newStage);
});
// 生成提醒
_reminderManager.generateReminders(_currentPlant);
}
六、交互设计
6.1 记录流程
6.2 数据查看流程
6.3 社区交流流程
七、扩展功能规划
7.1 后续版本规划
7.2 功能扩展建议
7.2.1 AI智能识别
识别功能:
- 拍照识别植物品种
- 自动检测病虫害
- 智能诊断健康状态
- 推荐养护方案
7.2.2 智能养护建议
建议功能:
- 个性化养护计划
- 环境监测提醒
- 季节养护指南
- 专家在线咨询
7.2.3 数据云同步
同步功能:
- 多设备数据同步
- 数据备份恢复
- 团队协作管理
- 数据导出分享
八、注意事项
8.1 开发注意事项
-
数据准确性:测量数据需确保准确记录
-
照片管理:大量照片需优化存储和加载
-
隐私保护:社区分享需保护用户隐私
-
性能优化:大量数据查询需优化性能
-
用户体验:记录操作需简单便捷
8.2 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 照片加载慢 | 图片过大 | 压缩图片质量 |
| 数据不同步 | 网络问题 | 添加离线缓存 |
| 阶段识别错误 | 算法不准确 | 优化识别逻辑 |
| 提醒不及时 | 后台限制 | 使用系统通知 |
| 社区加载慢 | 数据量大 | 分页加载优化 |
8.3 使用技巧
🌱 植物生长记录技巧 🌱
记录要点
- 定期记录:每周固定时间记录
- 持续跟踪:连续记录才能发现趋势
- 多角度拍照:全方位记录生长状态
- 详细备注:记录环境变化和养护操作
测量技巧
- 高度测量:从土面到最高点
- 叶片计数:只计算完全展开的叶片
- 茎粗测量:在固定位置测量
- 拍照角度:保持相同角度便于对比
养护建议
- 浇水适量:根据植物类型调整
- 光照充足:保证光合作用
- 适时施肥:生长期补充营养
- 定期修剪:保持良好株型
九、运行说明
9.1 环境要求
| 环境 | 版本要求 |
|---|---|
| Flutter SDK | >= 3.0.0 |
| Dart SDK | >= 2.17.0 |
| 鸿蒙OS | API 21+ |
| Web浏览器 | Chrome 90+ |
9.2 运行命令
# 查看可用设备
flutter devices
# 运行到Web服务器
flutter run -d web-server -t lib/main_plant_growth_tracker.dart --web-port 8142
# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_plant_growth_tracker.dart
# 代码分析
flutter analyze lib/main_plant_growth_tracker.dart
十、总结
智能植物生长记录应用通过生长记录、数据测量、观察日记、社区交流四大模块,为植物爱好者提供了一个全方位的植物管理平台。应用支持6种植物类型、6个生长阶段、6项测量指标、6种养护提醒,让植物养护更加科学便捷。
核心功能涵盖拍照记录、数据测量、观察日记、生长曲线四大模块。拍照记录支持相机拍照和相册选择,全方位记录生长状态;数据测量支持高度、叶片、茎粗等多维度测量;观察日记支持文字记录和照片上传;生长曲线可视化展示生长趋势。
应用采用 Material Design 3 设计规范,以清新的绿色为主色调,象征生机与活力。通过本应用,希望能够帮助植物爱好者更好地记录植物成长历程,分享养护经验,让每一株植物的成长都被完整记录。
智能植物生长记录——见证每一株植物的成长
更多推荐




所有评论(0)