Flutter 框架跨平台鸿蒙开发 - 家庭安全卫士
家庭安全卫士应用
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
一、项目概述
运行效果图





1.1 应用简介
家庭安全卫士是一款智能家居类应用,为用户提供全方位的家庭安全监测与管理服务。应用整合门窗、烟雾、漏水、移动、燃气、温度等多种传感器,实现统一管理、异常告警、一键联系人等功能,全方位守护家庭安全。
应用以蓝色为主色调,象征安全与信任。涵盖安全总览、设备管理、告警记录、紧急联系人四大模块。用户可以实时查看各传感器状态、接收异常告警、快速联系紧急联系人,构建完整的家庭安全防护体系。
1.2 核心功能
| 功能模块 | 功能描述 | 实现方式 |
|---|---|---|
| 传感器管理 | 6种传感器统一管理 | 枚举定义 |
| 实时监测 | 传感器状态实时更新 | Timer定时刷新 |
| 异常告警 | 多级告警与处理记录 | 状态管理 |
| 紧急联系 | 一键联系人快速拨打 | 弹窗交互 |
| 安全总览 | 整体安全状态展示 | 数据聚合 |
| 一键求助 | 紧急情况快速求助 | 批量通知 |
1.3 传感器类型定义
| 序号 | 传感器名称 | Emoji | 描述 |
|---|---|---|---|
| 1 | 门窗传感器 | 🚪 | 检测门窗开关状态 |
| 2 | 烟雾传感器 | 💨 | 检测烟雾浓度 |
| 3 | 漏水传感器 | 💧 | 检测漏水情况 |
| 4 | 移动传感器 | 🏃 | 检测人体移动 |
| 5 | 燃气传感器 | 🔥 | 检测燃气泄漏 |
| 6 | 温度传感器 | 🌡️ | 检测环境温度 |
1.4 告警级别定义
| 序号 | 级别名称 | Emoji | 颜色 |
|---|---|---|---|
| 1 | 正常 | ✅ | 绿色 |
| 2 | 警告 | ⚠️ | 黄色 |
| 3 | 危险 | ❌ | 橙色 |
| 4 | 紧急 | 🚨 | 红色 |
1.5 传感器状态定义
| 序号 | 状态名称 | 颜色 | 说明 |
|---|---|---|---|
| 1 | 在线 | 绿色 | 设备正常工作 |
| 2 | 离线 | 灰色 | 设备未连接 |
| 3 | 报警 | 红色 | 检测到异常 |
| 4 | 低电量 | 黄色 | 电量不足提醒 |
1.6 联系人类型定义
| 序号 | 类型名称 | Emoji | 用途 |
|---|---|---|---|
| 1 | 家人 | 👨👩👧👦 | 家庭成员联系 |
| 2 | 邻居 | 👥 | 紧急情况求助 |
| 3 | 报警 | 👮 | 110报警电话 |
| 4 | 消防 | 🚒 | 119消防电话 |
| 5 | 急救 | 🏥 | 120急救电话 |
| 6 | 物业 | 🏢 | 小区物业联系 |
1.7 技术栈
| 技术领域 | 技术选型 | 版本要求 |
|---|---|---|
| 开发框架 | Flutter | >= 3.0.0 |
| 编程语言 | Dart | >= 2.17.0 |
| 设计规范 | Material Design 3 | - |
| 状态管理 | setState | - |
| 定时任务 | Timer | - |
| 目标平台 | 鸿蒙OS / Web | API 21+ |
1.8 项目结构
lib/
└── main_home_security.dart
├── HomeSecurityApp # 应用入口
├── SensorType # 传感器类型枚举
├── AlertLevel # 告警级别枚举
├── SensorStatus # 传感器状态枚举
├── ContactType # 联系人类型枚举
├── Sensor # 传感器模型
├── AlertRecord # 告警记录模型
├── EmergencyContact # 紧急联系人模型
├── HomeSecurityHomePage # 主页面(底部导航)
├── _buildMonitorPage # 总览页面
├── _buildSensorsPage # 设备页面
├── _buildAlertsPage # 告警页面
└── _buildContactsPage # 联系人页面
二、系统架构
2.1 整体架构图
2.2 类图设计
2.3 页面导航流程
2.4 告警处理流程
三、核心模块设计
3.1 数据模型设计
3.1.1 传感器类型枚举 (SensorType)
enum SensorType {
door('门窗传感器', Icons.sensor_door, Color(0xFF4CAF50), '检测门窗开关状态'),
smoke('烟雾传感器', Icons.smoke_free, Color(0xFFFF5722), '检测烟雾浓度'),
water('漏水传感器', Icons.water_damage, Color(0xFF2196F3), '检测漏水情况'),
motion('移动传感器', Icons.directions_run, Color(0xFF9C27B0), '检测人体移动'),
gas('燃气传感器', Icons.gas_meter, Color(0xFFFF9800), '检测燃气泄漏'),
temperature('温度传感器', Icons.thermostat, Color(0xFF00BCD4), '检测环境温度');
final String label;
final IconData icon;
final Color color;
final String description;
}
3.1.2 告警级别枚举 (AlertLevel)
enum AlertLevel {
normal('正常', Icons.check_circle, Color(0xFF4CAF50)),
warning('警告', Icons.warning, Color(0xFFFFC107)),
danger('危险', Icons.dangerous, Color(0xFFFF5722)),
critical('紧急', Icons.error, Color(0xFFD32F2F));
final String label;
final IconData icon;
final Color color;
}
3.1.3 传感器模型 (Sensor)
class Sensor {
final String id; // 传感器ID
final String name; // 传感器名称
final SensorType type; // 传感器类型
final SensorStatus status; // 当前状态
final AlertLevel alertLevel; // 告警级别
final String location; // 安装位置
final int batteryLevel; // 电量百分比
final DateTime lastUpdate; // 最后更新时间
final String? currentValue; // 当前检测值
}
3.1.4 告警记录模型 (AlertRecord)
class AlertRecord {
final String id; // 告警ID
final Sensor sensor; // 关联传感器
final AlertLevel level; // 告警级别
final String message; // 告警消息
final DateTime time; // 告警时间
final bool isHandled; // 是否已处理
final String? handler; // 处理说明
}
3.1.5 传感器类型分布
3.2 页面结构设计
3.2.1 主页面布局
3.2.2 总览页结构
3.2.3 设备页结构
3.2.4 告警页结构
3.3 告警处理逻辑
3.4 紧急求助逻辑
四、UI设计规范
4.1 配色方案
应用以蓝色为主色调,象征安全与信任:
| 颜色类型 | 色值 | 用途 |
|---|---|---|
| 主色 | #1565C0 | 导航、主题元素 |
| 辅助色 | #42A5F5 | 渐变、背景 |
| 正常色 | #4CAF50 | 正常状态 |
| 警告色 | #FFC107 | 警告状态 |
| 危险色 | #FF5722 | 危险状态 |
| 紧急色 | #D32F2F | 紧急状态 |
4.2 传感器类型颜色
| 传感器类型 | 色值 | 视觉效果 |
|---|---|---|
| 门窗传感器 | #4CAF50 | 绿色安全 |
| 烟雾传感器 | #FF5722 | 橙色警示 |
| 漏水传感器 | #2196F3 | 蓝色水感 |
| 移动传感器 | #9C27B0 | 紫色神秘 |
| 燃气传感器 | #FF9800 | 橙色警告 |
| 温度传感器 | #00BCD4 | 青色温度 |
4.3 字体规范
| 元素 | 字号 | 字重 | 颜色 |
|---|---|---|---|
| 页面标题 | 24px | Bold | 主色 |
| 设备名称 | 15px | SemiBold | #000000 |
| 状态标签 | 10px | Regular | 状态颜色 |
| 告警消息 | 12px | Regular | #757575 |
| 统计数字 | 20px | Bold | 白色 |
4.4 组件规范
4.4.1 安全状态卡片
┌─────────────────────────────────────┐
│ ✅ 安全状态:正常 │
│ │
│ [5] [1] [0] │
│ 正常 警告 危险 │
└─────────────────────────────────────┘
4.4.2 快捷操作按钮
┌─────────────────────────────────────┐
│ 快捷操作 │
│ │
│ [🚨紧急求助] [🔒一键布防] [🔓一键撤防] │
└─────────────────────────────────────┘
4.4.3 传感器卡片
┌─────────────────────────────────────┐
│ [🚪] 大门传感器 [在线] [✅] │
│ 入口 · 已关闭 │
│ 🔋 85% │
└─────────────────────────────────────┘
4.4.4 告警卡片
┌─────────────────────────────────────┐
│ [⚠️] 大门传感器 [警告] │
│ 大门异常开启 │
│ 2小时前 [处理] │
└─────────────────────────────────────┘
4.4.5 联系人卡片
┌─────────────────────────────────────┐
│ [👨👩👧👦] 张三 [默认] │
│ 138****1234 │
│ 家人 📞 │
└─────────────────────────────────────┘
五、核心功能实现
5.1 传感器状态更新实现
void _startStatusUpdate() {
_updateTimer = Timer.periodic(const Duration(seconds: 5), (timer) {
_updateSensorStatus();
});
}
void _updateSensorStatus() {
final random = Random();
setState(() {
for (int i = 0; i < _sensors.length; i++) {
if (random.nextDouble() > 0.95) {
_sensors[i] = Sensor(
id: _sensors[i].id,
name: _sensors[i].name,
type: _sensors[i].type,
status: random.nextDouble() > 0.5
? SensorStatus.online
: SensorStatus.alert,
alertLevel: random.nextDouble() > 0.7
? AlertLevel.warning
: AlertLevel.normal,
location: _sensors[i].location,
batteryLevel: _sensors[i].batteryLevel,
lastUpdate: DateTime.now(),
currentValue: _sensors[i].currentValue,
);
}
}
});
}
5.2 告警触发实现
void _triggerAlert(Sensor sensor, AlertLevel level, String message) {
setState(() {
_alerts.insert(
0,
AlertRecord(
id: 'a${DateTime.now().millisecondsSinceEpoch}',
sensor: sensor,
level: level,
message: message,
time: DateTime.now(),
isHandled: false,
),
);
});
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('$message - ${level.label}'),
backgroundColor: level.color,
action: SnackBarAction(
label: '处理',
textColor: Colors.white,
onPressed: () => _handleAlert(_alerts.first),
),
),
);
}
5.3 告警处理实现
void _handleAlert(AlertRecord alert) {
setState(() {
final index = _alerts.indexOf(alert);
if (index != -1) {
_alerts[index] = AlertRecord(
id: alert.id,
sensor: alert.sensor,
level: alert.level,
message: alert.message,
time: alert.time,
isHandled: true,
handler: '已处理',
);
}
});
}
5.4 紧急求助实现
void _triggerEmergency() {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Row(
children: [
Icon(Icons.warning, color: Colors.red),
SizedBox(width: 8),
Text('紧急求助'),
],
),
content: const Text('确定要发送紧急求助吗?将通知所有紧急联系人。'),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('取消'),
),
ElevatedButton(
onPressed: () {
Navigator.pop(context);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('紧急求助已发送,正在通知所有联系人...'),
backgroundColor: Colors.red,
),
);
},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.red,
),
child: const Text('确认发送'),
),
],
),
);
}
5.5 联系人拨打实现
void _callContact(EmergencyContact contact) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('联系 ${contact.name}'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
Icon(contact.type.icon, size: 48, color: contact.type.color),
const SizedBox(height: 16),
Text(
contact.phone,
style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
const SizedBox(height: 8),
Text(contact.type.label),
],
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('取消'),
),
ElevatedButton(
onPressed: () {
Navigator.pop(context);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('正在拨打 ${contact.phone}...')),
);
},
style: ElevatedButton.styleFrom(
backgroundColor: contact.type.color,
),
child: const Text('拨打'),
),
],
),
);
}
六、交互设计
6.1 总览流程
6.2 设备管理流程
6.3 告警处理流程
七、扩展功能规划
7.1 后续版本规划
7.2 功能扩展建议
7.2.1 真实设备对接
对接功能:
- WiFi/Zigbee设备协议
- 实时数据同步
- 远程控制
- 固件升级
7.2.2 视频监控集成
监控功能:
- 实时视频流
- 云存储回放
- 移动侦测录像
- 双向语音
7.2.3 AI智能分析
AI功能:
- 异常行为识别
- 智能告警过滤
- 安全趋势分析
- 风险预测
八、注意事项
8.1 开发注意事项
-
定时器管理:状态更新Timer需要在dispose时取消
-
状态同步:传感器状态变化需及时更新UI
-
告警处理:告警记录需要持久化存储
-
权限处理:拨打电话需要申请相应权限
-
电量优化:定时刷新频率需平衡实时性和电量消耗
8.2 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 状态不更新 | Timer未启动 | 检查_startStatusUpdate |
| 告警不显示 | 列表未刷新 | 调用setState |
| 联系人拨打失败 | 权限未申请 | 申请电话权限 |
| 设备离线 | 网络问题 | 检查网络连接 |
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_home_security.dart --web-port 8140
# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_home_security.dart
# 代码分析
flutter analyze lib/main_home_security.dart
十、总结
家庭安全卫士应用通过安全总览、设备管理、告警记录、紧急联系人四大模块,为用户提供了一个全方位的家庭安全监测与管理平台。应用整合6种传感器类型、4级告警体系、6种联系人类型,实现统一管理、异常告警、一键联系人等功能。
核心功能涵盖传感器状态监测、告警处理、紧急求助三大模块。传感器类型包括门窗、烟雾、漏水、移动、燃气、温度,覆盖家庭安全的主要场景;告警级别分为正常、警告、危险、紧急四级,便于用户快速判断安全状况;紧急联系人支持家人、邻居、报警、消防、急救、物业六种类型,确保紧急情况能够快速联系。
应用采用 Material Design 3 设计规范,以蓝色为主色调,象征安全与信任。通过本应用,希望能够帮助用户构建完整的家庭安全防护体系,守护家庭安全。
家庭安全卫士——守护家庭安全
更多推荐


所有评论(0)