露营助手应用
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
一、项目概述
运行效果图






1.1 应用简介
露营助手是一款专注于户外露营服务的移动应用,旨在为用户提供全方位的露营支持,涵盖营地推荐、装备清单管理、露营知识学习等功能。应用以绿色为主色调,传递自然、环保的品牌形象。
应用收录了莫干山、千岛湖、安吉云上草原、东极岛、大明山、南浔古镇等热门露营地,提供详细的营地信息和设施介绍。通过智能装备清单和丰富的露营知识,帮助用户轻松规划和享受露营之旅。
1.2 核心功能
| 功能模块 | 功能描述 | 实现方式 |
|---|---|---|
| 营地推荐 | 热门营地展示筛选 | 列表+筛选 |
| 装备清单 | 露营物品打包管理 | 勾选列表 |
| 露营知识 | 技巧文章学习 | 卡片列表 |
| 收藏管理 | 收藏喜欢的营地 | 收藏列表 |
| 天气提示 | 适宜露营天气提醒 | 首页展示 |
1.3 营地分类
| 序号 | 地形类型 | 特点描述 | 代表营地 |
|---|---|---|---|
| 1 | 山地 | 竹林环绕空气清新 | 莫干山露营地 |
| 2 | 湖畔 | 湖光山色星空璀璨 | 千岛湖星空营地 |
| 3 | 高山 | 云海翻涌日出壮观 | 安吉云上草原 |
| 4 | 海岛 | 海风习习日出东方 | 东极岛海岛营地 |
| 5 | 森林 | 原始森林避暑纳凉 | 大明山森林营地 |
| 6 | 水乡 | 江南水乡慢生活 | 南浔古镇水乡营地 |
1.4 技术栈
| 技术领域 | 技术选型 | 版本要求 |
|---|---|---|
| 开发框架 | Flutter | >= 3.0.0 |
| 编程语言 | Dart | >= 2.17.0 |
| 设计规范 | Material Design 3 | - |
| 状态管理 | setState | - |
| 目标平台 | 鸿蒙OS / Web | API 21+ |
1.5 项目结构
lib/
└── main_camping.dart
├── CampingApp # 应用入口
├── Campsite # 营地数据模型
├── ChecklistItem # 清单项数据模型
├── KnowledgeArticle # 知识文章模型
├── MainHomePage # 主页面(底部导航)
├── HomePage # 首页
├── CampsitesPage # 营地列表页面
├── CampsiteDetailPage # 营地详情页面
├── ChecklistPage # 装备清单页面
├── KnowledgePage # 知识列表页面
├── KnowledgeDetailPage # 知识详情页面
└── ProfilePage # 个人中心页面
二、系统架构
2.1 整体架构图
Data Layer
Presentation Layer
主页面
MainHomePage
首页
营地列表
装备清单
知识库
个人中心
天气提示
快捷入口
热门营地
地形筛选
营地卡片
分类筛选
打包进度
文章列表
技巧展示
Campsite
营地模型
ChecklistItem
清单模型
KnowledgeArticle
知识模型
2.2 类图设计
manages
manages
manages
displays
lists
manages
displays
CampingApp
+Widget build()
Campsite
+String id
+String name
+String location
+String description
+double rating
+int reviews
+List<String> facilities
+String terrain
+String season
+String coverEmoji
+double price
+double distance
+bool isFavorite
ChecklistItem
+String id
+String name
+String category
+String emoji
+bool isPacked
+bool isEssential
KnowledgeArticle
+String id
+String title
+String category
+String content
+String emoji
+List<String> tips
+int readTime
MainHomePage
-int _currentIndex
-List<Widget> _pages
+Widget build()
HomePage
+Widget build()
CampsitesPage
-String selectedTerrain
+Widget build()
ChecklistPage
-List<ChecklistItem> _items
-String _selectedCategory
+Widget build()
KnowledgePage
+Widget build()
2.3 页面导航流程
首页
营地
清单
知识
我的
应用启动
主页面
底部导航
首页展示
营地列表页面
装备清单页面
知识列表页面
个人中心页面
点击营地卡片
营地详情页
筛选地形分类
点击营地列表项
点击文章卡片
知识详情页
收藏营地
返回上一页
2.4 数据流向图
详情页 列表 筛选器 营地列表页 用户 详情页 列表 筛选器 营地列表页 用户 进入营地列表 显示全部营地 选择地形 过滤营地 显示筛选结果 点击营地 跳转详情页 加载营地信息 展示营地详情 收藏营地 更新收藏状态 显示收藏成功
三、核心模块设计
3.1 数据模型设计
3.1.1 营地模型 (Campsite)
dart
class Campsite {
final String id; // 唯一标识
final String name; // 营地名称
final String location; // 地理位置
final String description; // 营地描述
final double rating; // 评分
final int reviews; // 评论数
final List<String> facilities; // 设施列表
final String terrain; // 地形类型
final String season; // 适宜季节
final String coverEmoji; // 封面表情
final double price; // 价格
final double distance; // 距离
final List<String> images; // 图片列表
bool isFavorite; // 是否收藏
}
3.1.2 清单项模型 (ChecklistItem)
dart
class ChecklistItem {
final String id; // 唯一标识
final String name; // 物品名称
final String category; // 物品分类
final String emoji; // 表情图标
bool isPacked; // 是否已打包
bool isEssential; // 是否必需品
}
3.1.3 知识文章模型 (KnowledgeArticle)
dart
class KnowledgeArticle {
final String id; // 唯一标识
final String title; // 文章标题
final String category; // 文章分类
final String content; // 文章内容
final String emoji; // 表情图标
final List<String> tips; // 技巧列表
final int readTime; // 阅读时长
}
3.1.4 营地分布
17% 17% 17% 17% 17% 17% 营地地形分布 山地 湖畔 高山 海岛 森林 水乡
3.2 页面结构设计
3.2.1 主页面布局
MainHomePage
IndexedStack
首页
营地列表
装备清单
知识库
个人中心
NavigationBar
首页 Tab
营地 Tab
清单 Tab
知识 Tab
我的 Tab
3.2.2 首页结构
首页
头部区域
快捷入口
热门营地
露营小贴士
渐变背景
天气提示
找营地
装备清单
露营知识
附近营地
营地卡片列表
点击跳转详情
3.2.3 装备清单页结构
装备清单页
进度头部
分类筛选
物品列表
添加按钮
打包进度
进度环
住宿装备
照明设备
烹饪装备
食品饮料
安全用品
电子设备
休闲装备
物品卡片
勾选状态
3.3 筛选功能设计
山地
湖畔
高山
海岛
森林
水乡
全部营地
选择地形
显示山地营地
显示湖畔营地
显示高山营地
显示海岛营地
显示森林营地
显示水乡营地
过滤结果
四、UI设计规范
4.1 配色方案
应用采用绿色为主色调,传递自然、环保的品牌形象:
| 颜色类型 | 色值 | 用途 |
|---|---|---|
| 主色 | #2E7D32 (Green) | 导航、强调元素 |
| 渐变起始 | #2E7D32 | 头部渐变 |
| 渐变结束 | #66BB6A | 头部渐变 |
| 成功色 | #4CAF50 | 完成状态 |
| 警告色 | #FF9800 | 必需品标识 |
| 背景色 | #F5F5F5 | 页面背景 |
4.2 字体规范
| 元素 | 字号 | 字重 | 颜色 |
|---|---|---|---|
| 页面标题 | 20px | Medium | #000000 |
| 营地名称 | 16px | Bold | #000000 |
| 分类名称 | 13px | SemiBold | 分类色 |
| 物品名称 | 14px | Medium | #000000 |
| 描述文字 | 12px | Regular | #757575 |
4.3 组件规范
4.3.1 营地卡片
┌─────────────────────────────────────────┐
│ ┌────┐ 莫干山露营地 ❤️ │
│ │ 🎋 │ 浙江省湖州市德清县 │
│ │ │ ⭐ 4.8 (1256) [山地] ¥168/晚 │
│ └────┘ │
└─────────────────────────────────────────┘
4.3.2 装备清单项
┌─────────────────────────────────────────┐
│ ┌────┐ 帐篷 ☑️ │
│ │ ⛺ │ 住宿装备 │
│ └────┘ │
└─────────────────────────────────────────┘
4.3.3 知识文章卡片
┌─────────────────────────────────────────┐
│ ┌────┐ 新手露营入门指南 > │
│ │ 🏕️ │ [入门知识] ⏱ 5分钟 │
│ │ │ 露营是一种亲近自然、放松身心... │
│ └────┘ │
└─────────────────────────────────────────┘
五、核心功能实现
5.1 营地卡片展示实现
dart
Widget _buildCampsiteCard(Campsite campsite) {
return Card(
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
side: BorderSide(color: Colors.grey.shade200),
),
child: InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CampsiteDetailPage(campsite: campsite),
),
);
},
borderRadius: BorderRadius.circular(16),
child: Padding(
padding: const EdgeInsets.all(16),
child: Row(
children: [
Container(
width: 80,
height: 80,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.green.shade200, Colors.green.shade100],
),
borderRadius: BorderRadius.circular(12),
),
child: Center(
child: Text(campsite.coverEmoji, style: const TextStyle(fontSize: 36)),
),
),
const SizedBox(width: 16),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(campsite.name, style: const TextStyle(fontWeight: FontWeight.bold)),
Text(campsite.location, style: TextStyle(fontSize: 12, color: Colors.grey.shade600)),
Row(
children: [
Icon(Icons.star, size: 14, color: Colors.amber.shade600),
Text('${campsite.rating}'),
Text('¥${campsite.price}/晚'),
],
),
],
),
),
],
),
),
),
);
}
5.2 装备清单实现
dart
Widget _buildChecklistItem(ChecklistItem item) {
return Card(
elevation: 0,
color: item.isPacked ? Colors.green.shade50 : null,
child: ListTile(
leading: Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: item.isEssential ? Colors.orange.withValues(alpha: 0.1) : Colors.grey.shade100,
borderRadius: BorderRadius.circular(10),
),
child: Center(child: Text(item.emoji, style: const TextStyle(fontSize: 20))),
),
title: Text(
item.name,
style: TextStyle(
decoration: item.isPacked ? TextDecoration.lineThrough : null,
),
),
subtitle: Text(item.category),
trailing: Checkbox(
value: item.isPacked,
onChanged: (value) {
setState(() {
item.isPacked = value ?? false;
});
},
activeColor: Colors.green,
),
),
);
}
5.3 打包进度计算
dart
Widget _buildProgressHeader() {
final packedCount = _items.where((e) => e.isPacked).length;
return Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.green.shade600, Colors.green.shade400],
),
),
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text('打包进度', style: TextStyle(color: Colors.white70)),
Text('$packedCount/${_items.length} 件',
style: const TextStyle(color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold)),
],
),
),
SizedBox(
width: 60,
height: 60,
child: Stack(
children: [
CircularProgressIndicator(
value: packedCount / _items.length,
strokeWidth: 6,
backgroundColor: Colors.white.withValues(alpha: 0.3),
valueColor: const AlwaysStoppedAnimation<Color>(Colors.white),
),
Center(
child: Text('${(packedCount / _items.length * 100).toInt()}%'),
),
],
),
),
],
),
);
}
5.4 收藏功能实现
dart
IconButton(
icon: Icon(_campsite.isFavorite ? Icons.favorite : Icons.favorite_border),
onPressed: () {
setState(() {
_campsite.isFavorite = !_campsite.isFavorite;
});
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(_campsite.isFavorite ? '已添加到收藏' : '已取消收藏'),
duration: const Duration(seconds: 1),
),
);
},
)
六、交互设计
6.1 筛选交互流程
列表 状态 筛选栏 用户 列表 状态 筛选栏 用户 点击地形标签 更新selectedTerrain 过滤营地数据 显示筛选结果
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 营地展示 装备清单 知识库 收藏功能 地图导航 天气预报 用户系统 社区分享 预订功能 AI推荐 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 露营助手应用开发计划
7.2 功能扩展建议
7.2.1 地图导航功能
增强营地定位:
- 集成地图SDK
- 路线规划导航
- 周边设施查询
7.2.2 天气预报功能
实时天气服务:
- 七天天气预报
- 适宜露营指数
- 灾害预警提醒
7.2.3 社区分享功能
用户交流平台:
- 露营日记分享
- 照片打卡记录
- 评论点赞互动
八、注意事项
8.1 开发注意事项
-
数据模型:Campsite模型包含完整营地信息和设施列表
-
筛选逻辑:使用where方法过滤营地列表
-
导航传参:详情页通过构造函数接收Campsite对象
-
状态管理:清单项使用isPacked字段追踪打包状态
8.2 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 筛选不生效 | 状态未更新 | 调用setState刷新 |
| 详情页空白 | 数据未传递 | 检查构造函数参数 |
| 进度不更新 | 变量未修改 | 检查isPacked赋值 |
| 颜色显示异常 | Color类型错误 | 使用withValues方法 |
8.3 使用提示
🏕️ 露营安全小贴士 🏕️
出发前:检查天气预报,列好装备清单。
到达后:熟悉营地环境,了解安全出口。
露营中:注意用火安全,保持营地整洁。
离开时:带走所有垃圾,保护自然环境。
九、运行说明
9.1 环境要求
| 环境 | 版本要求 |
|---|---|
| Flutter SDK | >= 3.0.0 |
| Dart SDK | >= 2.17.0 |
| 鸿蒙OS | API 21+ |
9.2 运行命令
bash
# 查看可用设备
flutter devices
# 运行到Web服务器
flutter run -d web-server -t lib/main_camping.dart --web-port 8100
# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_camping.dart
# 运行到Windows
flutter run -d windows -t lib/main_camping.dart
# 代码分析
flutter analyze lib/main_camping.dart
十、总结
露营助手应用通过系统化的户外露营服务,为露营爱好者提供了一个便捷的规划工具。应用构建了六大地形分类体系,收录了莫干山、千岛湖、安吉云上草原、东极岛、大明山、南浔古镇等热门露营地,帮助用户发现和选择适合的营地。
核心功能涵盖营地推荐、装备清单、露营知识、收藏管理四大模块。营地推荐以卡片形式展示热门营地信息,支持按地形筛选;装备清单提供25项常用露营物品,支持分类管理和打包进度追踪;露营知识库收录新手指南、装备选购、户外烹饪、野外安全等实用文章;收藏管理帮助用户快速访问喜欢的营地。
应用采用Material Design 3设计规范,以绿色为主色调,界面清新自然。通过本应用,希望能够帮助用户探索自然,享受户外生活的乐趣。
探索自然,享受户外生活