植物识别科普应用
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
一、项目概述
运行效果图




1.1 应用简介
植物识别科普是一款科技探索类应用,为用户提供拍照识别植物、植物百科、养护指南等一站式服务。支持6大植物分类、6种植物示例、详细的养护信息,让用户轻松认识身边的每一株植物。
应用以生机勃勃的绿色为主色调,象征大自然的生命力与希望。涵盖首页概览、拍照识别、植物百科、我的收藏四大模块。用户可以通过拍照或上传图片识别植物,查看详细的植物信息和养护指南,收藏感兴趣的植物。
1.2 核心功能
| 功能模块 | 功能描述 | 实现方式 |
|---|---|---|
| 拍照识别 | 拍照或上传图片识别植物 | 模拟识别动画 |
| 植物百科 | 详细的植物信息展示 | 分类筛选 + 详情页 |
| 养护指南 | 光照、水分、温度要求 | 图标 + 文字说明 |
| 收藏功能 | 收藏感兴趣的植物 | 列表管理 |
| 识别历史 | 查看识别记录 | 时间线展示 |
| 季节推荐 | 当季植物推荐 | 季节筛选 |
1.3 植物分类定义
| 序号 | 分类名称 | Emoji | 颜色 | 典型植物 |
|---|---|---|---|---|
| 1 | 花卉 | 🌸 | #E91E63 | 玫瑰、樱花 |
| 2 | 树木 | 🌳 | #4CAF50 | 樱花树、银杏 |
| 3 | 草本 | 🌿 | #8BC34A | 绿萝、薄荷 |
| 4 | 多肉 | 🌵 | #00BCD4 | 仙人掌、芦荟 |
| 5 | 蕨类 | 🌿 | #009688 | 铁线蕨、肾蕨 |
| 6 | 水生 | 🪷 | #2196F3 | 荷花、睡莲 |
1.4 季节定义
| 序号 | 季节名称 | Emoji | 颜色 | 代表植物 |
|---|---|---|---|---|
| 1 | 春季 | 🌸 | #FFCDD2 | 樱花、玫瑰 |
| 2 | 夏季 | ☀️ | #FFF59D | 荷花、绿萝 |
| 3 | 秋季 | 🍂 | #FFCC80 | 菊花、桂花 |
| 4 | 冬季 | ❄️ | #B3E5FC | 梅花、水仙 |
1.5 养护难度定义
| 序号 | 难度名称 | 星级 | 颜色 | 描述 |
|---|---|---|---|---|
| 1 | 容易 | ⭐ | #8BC34A | 新手友好,易于养护 |
| 2 | 中等 | ⭐⭐ | #FFC107 | 需要一定经验 |
| 3 | 困难 | ⭐⭐⭐ | #FF5722 | 需要专业知识和细心照料 |
1.6 技术栈
| 技术领域 | 技术选型 | 版本要求 |
|---|---|---|
| 开发框架 | Flutter | >= 3.0.0 |
| 编程语言 | Dart | >= 2.17.0 |
| 设计规范 | Material Design 3 | - |
| 动画控制 | AnimationController | - |
| 目标平台 | 鸿蒙OS / Web | API 21+ |
1.7 项目结构
lib/
└── main_plant_recognition.dart
├── PlantRecognitionApp # 应用入口
├── PlantCategory # 植物分类枚举
├── Season # 季节枚举
├── Difficulty # 养护难度枚举
├── Plant # 植物模型
├── ScanRecord # 识别记录模型
├── PlantRecognitionHomePage # 主页面(底部导航)
├── _buildHomePage # 首页
├── _buildScanPage # 识别页
├── _buildEncyclopediaPage # 百科页
├── _buildCollectionPage # 收藏页
└── _PlantDetailSheet # 植物详情弹窗
二、系统架构
2.1 整体架构图
Data Layer
Business Layer
Presentation Layer
主页面
PlantRecognitionHomePage
首页
识别页
百科页
收藏页
快速扫描
学习统计
最近识别
季节植物
拍照区域
操作按钮
识别历史
分类筛选
植物列表
收藏网格
识别处理器
ScanProcessor
收藏管理器
FavoriteManager
详情展示器
DetailPresenter
Plant
植物模型
ScanRecord
识别记录
PlantCategory
植物分类
2.2 类图设计
has
has
has
references
PlantRecognitionApp
+Widget build()
<<enumeration>>
PlantCategory
+String label
+String emoji
+Color color
+flower()
+tree()
+herb()
+succulent()
+fern()
+aquatic()
<<enumeration>>
Season
+String label
+String emoji
+Color color
+spring()
+summer()
+autumn()
+winter()
<<enumeration>>
Difficulty
+String label
+String stars
+Color color
+easy()
+medium()
+hard()
Plant
+String id
+String name
+String scientificName
+PlantCategory category
+String emoji
+String description
+List features
+Difficulty difficulty
+String lightNeed
+String waterNeed
+String temperature
+List careTips
+List benefits
+Season bestSeason
+bool isFavorite
ScanRecord
+String id
+Plant plant
+DateTime scanTime
+String location
2.3 页面导航流程
首页
识别
百科
收藏
应用启动
首页
底部导航
查看统计
拍照识别
植物列表
收藏植物
点击植物
识别结果
筛选分类
查看收藏
植物详情
收藏/取消收藏
2.4 植物识别流程
详情弹窗 识别处理器 识别页 用户 详情弹窗 识别处理器 识别页 用户 点击拍照/相册 启动识别动画 播放扫描动画 模拟识别完成 随机选择植物 返回识别结果 显示植物详情 展示完整信息
三、核心模块设计
3.1 数据模型设计
3.1.1 植物分类枚举 (PlantCategory)
dart
enum PlantCategory {
flower('花卉', '🌸', Color(0xFFE91E63)),
tree('树木', '🌳', Color(0xFF4CAF50)),
herb('草本', '🌿', Color(0xFF8BC34A)),
succulent('多肉', '🌵', Color(0xFF00BCD4)),
fern('蕨类', '🌿', Color(0xFF009688)),
aquatic('水生', '🪷', Color(0xFF2196F3));
final String label;
final String emoji;
final Color color;
}
3.1.2 季节枚举 (Season)
dart
enum Season {
spring('春季', '🌸', Color(0xFFFFCDD2)),
summer('夏季', '☀️', Color(0xFFFFF59D)),
autumn('秋季', '🍂', Color(0xFFFFCC80)),
winter('冬季', '❄️', Color(0xFFB3E5FC));
final String label;
final String emoji;
final Color color;
}
3.1.3 植物模型 (Plant)
dart
class Plant {
final String id; // 植物ID
final String name; // 植物名称
final String scientificName; // 学名
final PlantCategory category; // 分类
final String emoji; // 表情符号
final String description; // 描述
final List<String> features; // 主要特征
final Difficulty difficulty; // 养护难度
final String lightNeed; // 光照需求
final String waterNeed; // 水分需求
final String temperature; // 适宜温度
final List<String> careTips; // 养护技巧
final List<String> benefits; // 主要价值
final Season bestSeason; // 最佳季节
final bool isFavorite; // 是否收藏
}
3.1.4 识别记录模型 (ScanRecord)
dart
class ScanRecord {
final String id; // 记录ID
final Plant plant; // 识别的植物
final DateTime scanTime; // 识别时间
final String? location; // 识别地点
}
3.1.5 植物分类分布
25% 20% 18% 15% 12% 10% 植物分类分布示例 花卉 草本 多肉 树木 水生 蕨类
3.2 页面结构设计
3.2.1 主页面布局
PlantRecognitionHomePage
IndexedStack
首页
识别页
百科页
收藏页
NavigationBar
首页 Tab
识别 Tab
百科 Tab
收藏 Tab
3.2.2 首页结构
首页
顶部标题
快速扫描卡片
学习统计
最近识别
季节植物
识别次数
收藏植物
本月新增
连续学习
横向滚动列表
网格布局
3.2.3 识别页结构
识别页
拍照区域
操作按钮
识别历史
扫描框
闪光灯开关
拍照按钮
相册按钮
历史记录列表
3.2.4 百科页结构
百科页
分类筛选
植物列表
全部
花卉
树木
草本
多肉
蕨类
水生
植物卡片
植物图标
名称学名
养护信息
收藏按钮
3.3 植物识别逻辑
用户点击拍照/相册
启动扫描动画
动画播放2秒
随机选择植物
创建识别记录
添加到历史列表
重置动画状态
弹出植物详情
显示完整信息
3.4 收藏管理逻辑
是
否
用户点击收藏按钮
是否已收藏?
从收藏列表移除
更新按钮状态
添加到收藏列表
刷新界面
四、UI设计规范
4.1 配色方案
应用以生机勃勃的绿色为主色调,象征大自然的生命力与希望:
| 颜色类型 | 色值 | 用途 |
|---|---|---|
| 主色 | #4CAF50 (Green) | 导航、主题元素 |
| 辅助色 | #8BC34A | 次要按钮 |
| 第三色 | #C8E6C9 | 背景渐变 |
| 强调色 | #A5D6A7 | 卡片背景 |
| 背景色 | #E8F5E9 | 页面背景 |
| 卡片背景 | #FFFFFF | 内容卡片 |
4.2 分类专属颜色
| 分类 | 色值 | 视觉效果 |
|---|---|---|
| 花卉 | #E91E63 | 粉红浪漫 |
| 树木 | #4CAF50 | 绿色生机 |
| 草本 | #8BC34A | 嫩绿清新 |
| 多肉 | #00BCD4 | 青色可爱 |
| 蕨类 | #009688 | 深绿典雅 |
| 水生 | #2196F3 | 蓝色清澈 |
4.3 字体规范
| 元素 | 字号 | 字重 | 颜色 |
|---|---|---|---|
| 页面标题 | 24px | Bold | 主色 |
| 植物名称 | 16px | Bold | #000000 |
| 学名 | 14px | Italic | 灰色 |
| 养护信息 | 11px | Regular | 灰色 |
| 统计数字 | 18px | Bold | 主色 |
4.4 组件规范
4.4.1 快速扫描卡片
┌─────────────────────────────────────┐
│ 拍照识别植物 📷 │
│ 拍照或上传图片,快速识别植物 │
└─────────────────────────────────────┘
4.4.2 学习统计卡片
┌─────────────────────────────────────┐
│ 学习统计 │
│ │
│ 📷 5次 ❤️ 3种 📈 3种 🔥 7天│
│ 识别次数 收藏植物 本月新增 连续学习│
└─────────────────────────────────────┘
4.4.3 植物卡片
┌─────────────────────────────────────┐
│ ┌──────┐ │
│ │ 🌹 │ 玫瑰 ❤️ │
│ │ │ Rosa chinensis │
│ └──────┘ [花卉] │
│ ☀️ 充足阳光 💧 适量浇水 │
└─────────────────────────────────────┘
4.4.4 分类筛选芯片
┌─────────────────────────────────────┐
│ [🌱 全部] [🌸 花卉] [🌳 树木] │
│ [🌿 草本] [🌵 多肉] [🌿 蕨类] │
│ [🪷 水生] │
└─────────────────────────────────────┘
4.4.5 养护信息卡片
┌─────────────────────────────────────┐
│ 养护要求 │
│ │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ ☀️ │ │ 💧 │ │ 🌡️ │ │
│ │ 光照 │ │ 水分 │ │ 温度 │ │
│ │充足 │ │适量 │ │15-25°│ │
│ └─────┘ └─────┘ └─────┘ │
└─────────────────────────────────────┘
五、核心功能实现
5.1 模拟识别实现
dart
void _simulateScan() {
_scanController.forward().then((_) {
final random = Random();
final plant = _plants[random.nextInt(_plants.length)];
setState(() {
_scanRecords.insert(0, ScanRecord(
id: DateTime.now().millisecondsSinceEpoch.toString(),
plant: plant,
scanTime: DateTime.now(),
));
});
_scanController.reset();
_showPlantDetail(plant);
});
}
5.2 收藏功能实现
dart
void _toggleFavorite(Plant plant) {
setState(() {
if (_favorites.contains(plant)) {
_favorites.remove(plant);
} else {
_favorites.add(plant);
}
});
}
5.3 分类筛选实现
dart
Widget _buildCategoryFilter() {
return Container(
height: 50,
child: ListView(
scrollDirection: Axis.horizontal,
children: [
_buildCategoryChip(null, '全部', '🌱'),
...PlantCategory.values.map((category) {
return _buildCategoryChip(category, category.label, category.emoji);
}),
],
),
);
}
5.4 植物详情展示
dart
void _showPlantDetail(Plant plant) {
showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (context) => _PlantDetailSheet(
plant: plant,
isFavorite: _favorites.contains(plant),
onFavoriteToggle: () => _toggleFavorite(plant),
),
);
}
5.5 时间格式化
dart
String _formatTime(DateTime time) {
final now = DateTime.now();
final diff = now.difference(time);
if (diff.inMinutes < 60) return '${diff.inMinutes}分钟前';
if (diff.inHours < 24) return '${diff.inHours}小时前';
if (diff.inDays < 7) return '${diff.inDays}天前';
return '${time.month}月${time.day}日';
}
六、交互设计
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 2024-03-24 2024-03-31 基础UI框架 植物数据模型 识别模拟功能 真实AI识别 图片上传功能 更多植物数据 社区分享 养护提醒 云端同步 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 植物识别科普应用开发计划
7.2 功能扩展建议
7.2.1 真实AI识别
识别功能:
- 集成图像识别API
- 支持多种植物识别
- 识别准确率优化
- 离线识别支持
7.2.2 社区功能
社区功能:
- 植物分享动态
- 养护经验交流
- 问答社区
- 植物达人认证
7.2.3 养护提醒
提醒功能:
- 浇水提醒
- 施肥提醒
- 换盆提醒
- 病虫害预警
八、注意事项
8.1 开发注意事项
-
性能优化:植物列表较多时需使用ListView.builder
-
图片处理:真实识别需处理图片压缩和格式转换
-
数据存储:收藏和识别记录需持久化存储
-
动画控制:扫描动画需正确释放资源
-
状态管理:收藏状态需及时同步更新
8.2 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 列表卡顿 | 数据量大 | 使用builder |
| 收藏不同步 | 状态未更新 | setState刷新 |
| 动画不播放 | 控制器未初始化 | 检查initState |
| 详情不显示 | 数据传递错误 | 检查参数传递 |
| 分类筛选无效 | 状态未保存 | 使用setState |
8.3 使用技巧
🌱 植物识别科普使用技巧 🌱
识别技巧
- 拍照时保持光线充足
- 尽量拍摄植物的叶子或花朵
- 避免逆光拍摄
- 植物主体占画面大部分
养护建议
- 根据光照需求选择摆放位置
- 浇水遵循"见干见湿"原则
- 定期转动花盆保证均匀生长
- 注意季节变化调整养护方式
学习建议
- 每天识别一种新植物
- 收藏感兴趣的植物
- 阅读养护技巧
- 分享给朋友一起学习
九、运行说明
9.1 环境要求
| 环境 | 版本要求 |
|---|---|
| Flutter SDK | >= 3.0.0 |
| Dart SDK | >= 2.17.0 |
| 鸿蒙OS | API 21+ |
| Web浏览器 | Chrome 90+ |
9.2 运行命令
bash
# 查看可用设备
flutter devices
# 运行到Web服务器
flutter run -d web-server -t lib/main_plant_recognition.dart --web-port 8140
# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_plant_recognition.dart
# 代码分析
flutter analyze lib/main_plant_recognition.dart
十、总结
植物识别科普应用通过首页概览、拍照识别、植物百科、我的收藏四大模块,为用户提供了一个便捷的植物学习和识别平台。应用支持6大植物分类、详细的养护信息、收藏功能,让用户轻松认识身边的每一株植物。
核心功能涵盖拍照识别、植物百科、养护指南、收藏管理四大模块。拍照识别支持模拟识别动画,展示识别结果;植物百科提供分类筛选和详细信息展示;养护指南包含光照、水分、温度等关键信息;收藏管理方便用户保存感兴趣的植物。
应用采用 Material Design 3 设计规范,以生机勃勃的绿色为主色调,象征大自然的生命力与希望。通过本应用,希望能够帮助用户认识更多植物,学习养护知识,培养对大自然的热爱。
植物识别科普------认识身边的每一株植物