Flutter for OpenHarmony 猫咪管家App实战:急救指南功能开发
摘要:本文介绍了一个猫咪急救指南功能的实现,包含常见紧急情况的症状识别和应急处理方法。通过定义不同紧急情况的数据(如中毒、外伤、骨折等),每种情况配有对应图标、颜色、症状和处理步骤。页面结构包含顶部警告提示和可展开的急救卡片列表,卡片详细展示症状表现和分步骤的应急措施。设计上采用不同颜色和图标区分紧急程度,强调关键注意事项(如不要自行催吐或复位骨折),并提醒用户指南不能替代专业医疗,紧急情况需立即

养猫难免遇到紧急情况,提前了解一些急救知识很有必要。今天来实现一个急救指南功能,列出常见的紧急情况,包括症状识别和应急处理方法。
一、急救数据定义
用列表存储各种紧急情况:
final List<Map<String, dynamic>> _emergencies = const [
{
'title': '中毒',
'icon': Icons.warning,
'color': Colors.red,
'symptoms': '呕吐、腹泻、流涎、抽搐、呼吸困难',
'actions': [
'立即带猫咪远离毒源',
'不要自行催吐',
'记录可能的毒物名称',
'立即送医',
],
},
每种情况包含标题、图标、颜色、症状和处理步骤。
中毒用红色警告,是最紧急的情况之一。
外伤和骨折:
{
'title': '外伤出血',
'icon': Icons.healing,
'color': Colors.orange,
'symptoms': '伤口出血、疼痛、舔舐伤口',
'actions': [
'用干净纱布按压止血',
'不要使用酒精消毒',
'防止猫咪舔舐伤口',
'尽快就医',
],
},
{
'title': '骨折',
'icon': Icons.accessibility_new,
'color': Colors.purple,
'symptoms': '跛行、肿胀、不愿移动、疼痛',
'actions': [
'尽量不要移动猫咪',
'用毛巾轻轻包裹固定',
'不要尝试复位',
'立即送医',
],
},
外伤提醒不要用酒精,会刺激伤口。
骨折强调不要自己复位,容易造成二次伤害。
呼吸困难和中暑:
{
'title': '呼吸困难',
'icon': Icons.air,
'color': Colors.blue,
'symptoms': '张口呼吸、呼吸急促、嘴唇发紫',
'actions': [
'保持环境通风',
'不要强迫猫咪躺下',
'减少刺激和压力',
'紧急送医',
],
},
{
'title': '中暑',
'icon': Icons.wb_sunny,
'color': Colors.amber,
'symptoms': '喘气、流涎、虚弱、体温升高',
'actions': [
'移至阴凉处',
'用湿毛巾擦拭身体',
'提供少量饮水',
'尽快就医',
],
},
猫咪张口呼吸是危险信号,正常猫不会这样。
中暑要降温但不能用冰水,温差太大会休克。
抽搐和尿道阻塞:
{
'title': '抽搐/癫痫',
'icon': Icons.flash_on,
'color': Colors.indigo,
'symptoms': '全身抽搐、意识丧失、口吐白沫',
'actions': [
'移开周围危险物品',
'不要强行按住猫咪',
'记录发作时间',
'发作后立即就医',
],
},
{
'title': '尿道阻塞',
'icon': Icons.block,
'color': Colors.teal,
'symptoms': '频繁蹲厕、无尿或少尿、嚎叫',
'actions': [
'这是紧急情况!',
'不要按压腹部',
'立即送医',
'24小时内可能致命',
],
},
抽搐时不要按住猫咪,会造成伤害。
尿道阻塞是公猫常见急症,24 小时内可能致命。
误食异物:
{
'title': '误食异物',
'icon': Icons.no_food,
'color': Colors.brown,
'symptoms': '呕吐、不吃东西、腹痛',
'actions': [
'不要自行催吐',
'记录可能吞食的物品',
'观察是否有呕吐物',
'尽快就医检查',
],
},
误食异物不要催吐,尖锐物品可能划伤食道。
记录吞食的东西,方便医生判断。
二、页面整体结构
顶部警告提示:
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('急救指南'),
backgroundColor: Colors.red,
),
body: Column(
children: [
Container(
padding: EdgeInsets.all(16.w),
color: Colors.red[50],
child: Row(
children: [
Icon(Icons.emergency, color: Colors.red, size: 24.sp),
SizedBox(width: 12.w),
Expanded(
child: Text(
'紧急情况请立即联系宠物医院!\n以下指南仅供参考,不能替代专业医疗。',
style: TextStyle(fontSize: 13.sp, color: Colors.red[800]),
),
),
],
),
),
AppBar 用红色,强调这是紧急相关的页面。
顶部提示用户要联系医院,指南只是参考。
列表区域:
Expanded(
child: ListView.builder(
padding: EdgeInsets.all(16.w),
itemCount: _emergencies.length,
itemBuilder: (context, index) => _buildEmergencyCard(_emergencies[index]),
),
),
Expanded 让列表占满剩余空间。
ListView.builder 按需构建,性能好。
三、急救卡片组件
用 ExpansionTile 展开详情:
Widget _buildEmergencyCard(Map<String, dynamic> emergency) {
return Card(
margin: EdgeInsets.only(bottom: 12.h),
child: ExpansionTile(
leading: CircleAvatar(
backgroundColor: (emergency['color'] as Color).withOpacity(0.1),
child: Icon(emergency['icon'], color: emergency['color'], size: 24.sp),
),
title: Text(
emergency['title'],
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16.sp),
),
每种情况配不同颜色和图标,一眼能区分。
标题加粗,是卡片的主要信息。
展开后的内容:
children: [
Padding(
padding: EdgeInsets.all(16.w),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('症状表现', style: TextStyle(fontWeight: FontWeight.bold, color: Colors.grey[700])),
SizedBox(height: 4.h),
Text(emergency['symptoms'], style: TextStyle(fontSize: 13.sp)),
SizedBox(height: 12.h),
Text('应急措施', style: TextStyle(fontWeight: FontWeight.bold, color: Colors.grey[700])),
SizedBox(height: 4.h),
分两部分:症状表现和应急措施。
小标题用灰色加粗,和内容区分。
应急措施列表:
...(emergency['actions'] as List<String>).map((action) => Padding(
padding: EdgeInsets.only(bottom: 4.h),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(Icons.check_circle, size: 16.sp, color: emergency['color']),
SizedBox(width: 8.w),
Expanded(child: Text(action, style: TextStyle(fontSize: 13.sp))),
],
),
)),
用展开运算符
...把 map 结果展开。
每条措施前面有个勾选图标,用对应的颜色。
四、图标选择的考量
每种情况配合适的图标:
'icon': Icons.warning, // 中毒 - 警告
'icon': Icons.healing, // 外伤 - 创可贴
'icon': Icons.accessibility_new, // 骨折 - 人形
'icon': Icons.air, // 呼吸困难 - 空气
'icon': Icons.wb_sunny, // 中暑 - 太阳
'icon': Icons.flash_on, // 抽搐 - 闪电
'icon': Icons.block, // 尿道阻塞 - 禁止
'icon': Icons.no_food, // 误食 - 禁止食物
图标要和情况语义匹配。
用户看图标就能大概知道是什么情况。
五、颜色的紧急程度
颜色选择有讲究:
'color': Colors.red, // 中毒 - 最紧急
'color': Colors.orange, // 外伤 - 紧急
'color': Colors.teal, // 尿道阻塞 - 紧急
'color': Colors.amber, // 中暑 - 需要处理
'color': Colors.blue, // 呼吸困难 - 需要关注
红色和橙色表示最紧急的情况。
颜色深浅暗示紧急程度。
六、警告提示的设计
顶部固定提示:
Container(
padding: EdgeInsets.all(16.w),
color: Colors.red[50],
child: Row(
children: [
Icon(Icons.emergency, color: Colors.red, size: 24.sp),
SizedBox(width: 12.w),
Expanded(
child: Text(
'紧急情况请立即联系宠物医院!\n以下指南仅供参考,不能替代专业医疗。',
背景用浅红色,和列表区分。
文字用深红色,醒目但不刺眼。
为什么要加这个提示:
急救指南只是应急参考,不能替代专业医疗。
避免用户过度依赖 App 而延误就医。
七、列表项的交互
ExpansionTile 的优势:
ExpansionTile(
leading: ...,
title: ...,
children: [...],
)
点击整行都能展开,操作区域大。
自带展开收起动画,体验流畅。
展开状态管理:
ExpansionTile 内部维护状态,不需要手动管理。
多个卡片可以同时展开,方便对比。
八、应急措施的展示
用列表而不是纯文本:
'actions': [
'立即带猫咪远离毒源',
'不要自行催吐',
'记录可能的毒物名称',
'立即送医',
],
分步骤列出,用户按顺序操作。
比一大段文字更容易阅读和执行。
每条措施带图标:
Row(
children: [
Icon(Icons.check_circle, size: 16.sp, color: emergency['color']),
SizedBox(width: 8.w),
Expanded(child: Text(action, ...)),
],
)
勾选图标暗示这是待办事项。
颜色和卡片主题色一致。
九、crossAxisAlignment 的作用
设为 start 的原因:
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(...),
Expanded(child: Text(action, ...)),
],
)
如果措施文字换行,图标和第一行对齐。
不设的话图标会垂直居中,看起来怪。
十、页面布局的层次
整体结构:
Scaffold(
appBar: AppBar(...), // 红色标题栏
body: Column(
children: [
Container(...), // 顶部警告
Expanded(
child: ListView.builder(...), // 急救列表
),
],
),
)
Column 让警告和列表垂直排列。
Expanded 让列表占满剩余空间。
小结
急救指南是个实用功能,关键时刻能帮上忙。UI 上用红色主题强调紧急性,顶部固定警告提示用户要联系医院。每种情况用 ExpansionTile 展开详情,包含症状识别和分步骤的应急措施。数据结构用 Map 列表,每种情况配不同颜色和图标,视觉上容易区分。希望大家的猫咪都健健康康,用不上这个功能。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐
所有评论(0)