植物识别科普应用


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

一、项目概述

运行效果图

image-20260409192547332

image-20260409192552301

image-20260409192556379

image-20260409192600604

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 / WebAPI 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)
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)
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)
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)
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 字体规范

元素字号字重颜色
页面标题24pxBold主色
植物名称16pxBold#000000
学名14pxItalic灰色
养护信息11pxRegular灰色
统计数字18pxBold主色

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 模拟识别实现

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 收藏功能实现

void _toggleFavorite(Plant plant) {
  setState(() {
    if (_favorites.contains(plant)) {
      _favorites.remove(plant);
    } else {
      _favorites.add(plant);
    }
  });
}

5.3 分类筛选实现

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 植物详情展示

void _showPlantDetail(Plant plant) {
  showModalBottomSheet(
    context: context,
    isScrollControlled: true,
    builder: (context) => _PlantDetailSheet(
      plant: plant,
      isFavorite: _favorites.contains(plant),
      onFavoriteToggle: () => _toggleFavorite(plant),
    ),
  );
}

5.5 时间格式化

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-072024-01-142024-01-212024-01-282024-02-042024-02-112024-02-182024-02-252024-03-032024-03-102024-03-172024-03-242024-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 开发注意事项

  1. 性能优化:植物列表较多时需使用ListView.builder

  2. 图片处理:真实识别需处理图片压缩和格式转换

  3. 数据存储:收藏和识别记录需持久化存储

  4. 动画控制:扫描动画需正确释放资源

  5. 状态管理:收藏状态需及时同步更新

8.2 常见问题

问题原因解决方案
列表卡顿数据量大使用builder
收藏不同步状态未更新setState刷新
动画不播放控制器未初始化检查initState
详情不显示数据传递错误检查参数传递
分类筛选无效状态未保存使用setState

8.3 使用技巧

🌱 植物识别科普使用技巧 🌱

识别技巧

  • 拍照时保持光线充足
  • 尽量拍摄植物的叶子或花朵
  • 避免逆光拍摄
  • 植物主体占画面大部分

养护建议

  • 根据光照需求选择摆放位置
  • 浇水遵循"见干见湿"原则
  • 定期转动花盆保证均匀生长
  • 注意季节变化调整养护方式

学习建议

  • 每天识别一种新植物
  • 收藏感兴趣的植物
  • 阅读养护技巧
  • 分享给朋友一起学习

九、运行说明

9.1 环境要求

环境版本要求
Flutter SDK>= 3.0.0
Dart SDK>= 2.17.0
鸿蒙OSAPI 21+
Web浏览器Chrome 90+

9.2 运行命令

# 查看可用设备
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 设计规范,以生机勃勃的绿色为主色调,象征大自然的生命力与希望。通过本应用,希望能够帮助用户认识更多植物,学习养护知识,培养对大自然的热爱。

植物识别科普——认识身边的每一株植物


Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐