博文九:Flutter for OpenHarmony 社区便民实战——社区健康体检预约+慢病打卡便民模块

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


一、实战前言

社区老年群体健康管理是民生服务的核心痛点,传统线下体检预约排队耗时、慢病用药无提醒、健康数据无记录、子女远程无法知晓老人健康状况等问题,严重影响老年居民生活质量与社区养老服务效率。

本文基于Flutter for OpenHarmony轻量化开发社区健康管理便民模块,无需适配复杂硬件,兼容全系低配鸿蒙机型,集成体检套餐在线预约、分时段错峰就诊、健康数据一键录入、慢病吃药提醒、健康周报自动推送全闭环能力,适老化极简交互设计,轻松通过鸿蒙应用市场上架审核,可直接商用落地。

在这里插入图片描述


二、模块核心实用能力

✅ 社区卫生室体检套餐分类展示,在线预约无需现场排队,支持预约时段精准选择

✅ 分时段错峰预约机制,按老人出行习惯划分时段,避免人群扎堆聚集,降低交叉感染风险

✅ 血压、血糖、体重等健康数据一键录入,自动校验异常值,生成可视化健康趋势曲线

✅ 慢病吃药多时段闹钟提醒,鸿蒙原生弹窗 + 铃声双重通知,支持节假日自定义调整

✅ 每周健康报告自动汇总,一键推送至子女微信 / 短信,实现远程健康监护

✅ 大字高对比适老化 UI,操作步骤简化至三步内,老年用户可独立完成所有操作

✅ 离线数据缓存能力,断网状态下可查看历史健康记录、已预约体检信息,页面不闪退


三、轻量化技术架构

摒弃重型健康 SDK 依赖,采用四层低功耗分层架构,兼顾低内存、低流量、低耗电需求,适配社区全量老旧低配鸿蒙手机:

1. 适老化交互表现层:基于 Flutter 原生基础组件搭建界面,放大触控区域(按钮≥48px)、弱化动态特效、采用黑底黄字高对比度配色,贴合老年用户视觉与操作习惯,页面跳转零延迟。

2. 健康数据安全层:老人健康数据本地加密存储 + 云端脱敏备份,仅留存必要健康指标,严守鸿蒙隐私合规要求,数据访问需二次确认。

3. 异步提醒调度层:基于鸿蒙系统闹钟服务,本地调度提醒任务,无需后台常驻进程,兼顾提醒精准性与设备续航。

4. 预约同步闭环层:HTTPS 加密同步体检预约信息至社区卫生室后台,预约状态实时更新,到期自动推送提醒,数据双向可追溯。


四、鸿蒙合规权限配置

遵循权限最小化原则,仅配置刚需权限,无多余隐私采集,规避应用审核驳回风险:

"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET",
    "reason": "加密同步体检预约信息、上传健康数据、推送健康周报至子女端",
    "usedScene": {
      "abilities": ["EntryAbility"],
      "when": "inuse"
    }
  },
  {
    "name": "ohos.permission.NOTIFICATION_AGENT",
    "reason": "健康吃药提醒、体检预约到期弹窗通知",
    "usedScene": {
      "abilities": ["EntryAbility"],
      "when": "always"
    }
  }
]

五、商用标准化健康数据模型

适配前后端接口联动,自带序列化容错处理,后期可无缝拓展心率、血脂等健康指标,复用性极强:

/// 健康记录统一实体类,项目全局可复用
class HealthRecord {
  final int bloodPressHigh;    // 高压值
  final int bloodPressLow;     // 低压值
  final double bloodSugar;     // 血糖值
  final double weight;         // 体重(拓展字段)
  final DateTime recordTime;   // 记录时间
  final String userId;         // 老人唯一标识

  HealthRecord({
    required this.bloodPressHigh,
    required this.bloodPressLow,
    required this.bloodSugar,
    required this.weight,
    required this.recordTime,
    required this.userId,
  });

  // 实体序列化,适配本地加密缓存与云端同步
  Map<String, dynamic> toJson() {
    return {
      "bloodPressHigh": bloodPressHigh,
      "bloodPressLow": bloodPressLow,
      "bloodSugar": bloodSugar,
      "weight": weight,
      "recordTime": recordTime.toIso8601String(),
      "userId": userId,
    };
  }

  // 反序列化,兼容接口空值容错
  factory HealthRecord.fromJson(Map<String, dynamic> json) {
    return HealthRecord(
      bloodPressHigh: json["bloodPressHigh"] ?? 0,
      bloodPressLow: json["bloodPressLow"] ?? 0,
      bloodSugar: json["bloodSugar"]?.toDouble() ?? 0.0,
      weight: json["weight"]?.toDouble() ?? 0.0,
      recordTime: DateTime.tryParse(json["recordTime"] ?? "") ?? DateTime.now(),
      userId: json["userId"] ?? "",
    );
  }
}

/// 体检预约实体类
class PhysicalExamAppointment {
  final String userId;          // 老人唯一标识
  final String packageName;     // 体检套餐名称
  final DateTime appointTime;   // 预约时间
  final int appointStatus;      // 0待就诊 1已完成 2已取消
  final String appointId;       // 唯一预约单号

  PhysicalExamAppointment({
    required this.userId,
    required this.packageName,
    required this.appointTime,
    required this.appointStatus,
    required this.appointId,
  });

  Map<String, dynamic> toJson() {
    return {
      "userId": userId,
      "packageName": packageName,
      "appointTime": appointTime.toIso8601String(),
      "appointStatus": appointStatus,
      "appointId": appointId,
    };
  }
}

六、健康趋势曲线渲染核心代码

自带空值拦截、异常数据过滤、时间排序降噪,低配机型渲染丝滑,杜绝图表白屏、页面闪退问题:

/// 组装近30天血压趋势数据源(高压)
List<int> getBloodPressHighChartData(List<HealthRecord> list) {
  // 防御性拦截空数据,避免渲染崩溃
  if (list.isEmpty) return [];
  // 按记录时间倒序排序,保证趋势时序连贯
  list.sort((a, b) => b.recordTime.compareTo(a.recordTime));
  // 过滤异常数据(高压合理范围90-180),避免图表畸变
  return list.map((e) => e.bloodPressHigh)
      .where((v) => v >= 90 && v <= 180)
      .take(30) // 仅取近30天数据,控制渲染压力
      .toList();
}

/// 组装近30天血糖趋势数据源
List<double> getBloodSugarChartData(List<HealthRecord> list) {
  if (list.isEmpty) return [];
  list.sort((a, b) => b.recordTime.compareTo(a.recordTime));
  // 过滤异常血糖值(合理范围3.9-7.0)
  return list.map((e) => e.bloodSugar)
      .where((v) => v >= 3.9 && v <= 7.0)
      .take(30)
      .toList();
}

七、核心业务逻辑

7.1 定时吃药提醒z

叠加系统权限校验、重复提醒拦截、异常兜底三重防护,杜绝提醒失效、重复提醒问题:

/// 鸿蒙原生设置慢病吃药提醒
Future<bool> setMedicineAlarm(TimeOfDay time, String medicineName) async {
  // 拦截空时间/空药品名称,规避误操作
  if (medicineName.isEmpty) return false;
  try {
    // 校验通知权限,无权限则引导用户开启
    bool hasPermission = await checkNotificationPermission();
    if (!hasPermission) {
      await requestNotificationPermission();
      hasPermission = await checkNotificationPermission();
      if (!hasPermission) return false;
    }
    // 转换TimeOfDay为DateTime,适配系统闹钟接口
    DateTime alarmTime = DateTime.now().copyWith(
      hour: time.hour,
      minute: time.minute,
      second: 0,
      microsecond: 0,
    );
    // 避免设置过去的时间,自动顺延至次日
    if (alarmTime.isBefore(DateTime.now())) {
      alarmTime = alarmTime.add(Duration(days: 1));
    }
    // 调度系统闹钟,添加唯一标识避免重复提醒
    String alarmId = "medicine_${time.hour}_${time.minute}_${medicineName}";
    await AlarmManager.scheduleAlarm(
      alarmId: alarmId,
      alarmTime: alarmTime,
      title: "吃药提醒",
      content: "该吃${medicineName}啦,注意身体~",
      repeat: true, // 每日重复提醒
    );
    // 本地缓存提醒配置,便于后续修改/取消
    await saveMedicineAlarmLocal(alarmId, time, medicineName);
    return true;
  } catch (e) {
    // 全场景异常兜底,返回false便于前端提示用户
    return false;
  }
}

// 校验通知权限
Future<bool> checkNotificationPermission() async {}
// 请求通知权限
Future<void> requestNotificationPermission() async {}
// 本地缓存提醒配置
Future<void> saveMedicineAlarmLocal(String alarmId, TimeOfDay time, String medicineName) async {}

7.2 体检预约提交

/// 提交体检预约请求,防重复预约+异常兜底
Future<bool> submitExamAppointment(PhysicalExamAppointment appointment) async {
  // 拦截空预约信息,规避无效请求
  if (appointment.appointId.isEmpty || appointment.userId.isEmpty) return false;
  try {
    // 15秒超时熔断,弱网环境不卡死页面
    final result = await examApi.submitAppointment(appointment.toJson())
        .timeout(Duration(seconds: 15));
    // 校验预约单号唯一性,防止重复提交
    if (result.duplicate) {
      return false;
    }
    // 预约成功同步本地缓存
    if (result.success) {
      await saveExamAppointLocal(appointment);
      // 预约到期前1天自动设置提醒
      await setExamReminder(appointment);
    }
    return result.success;
  } catch (e) {
    return false;
  }
}

// 保存预约信息到本地
Future<void> saveExamAppointLocal(PhysicalExamAppointment appointment) async {}
// 设置体检预约提醒
Future<void> setExamReminder(PhysicalExamAppointment appointment) async {}

7.3 健康周报生成与推送

/// 生成并推送每周健康报告给子女
Future<bool> generateAndPushHealthReport(String userId, String childPhone) async {
  if (userId.isEmpty || childPhone.isEmpty) return false;
  try {
    // 获取近7天健康数据
    List<HealthRecord> weekData = await getWeekHealthData(userId);
    // 生成结构化健康报告
    String reportContent = buildHealthReport(weekData);
    // 加密推送至子女端(短信/微信)
    final pushResult = await pushApi.sendToChild(
      phone: childPhone,
      content: reportContent,
      type: "health_report",
    );
    return pushResult.success;
  } catch (e) {
    return false;
  }
}

// 获取近7天健康数据
Future<List<HealthRecord>> getWeekHealthData(String userId) async {}
// 构建健康报告内容
String buildHealthReport(List<HealthRecord> data) {
  // 汇总平均血压、血糖,标注异常值
  double avgBloodSugar = data.isNotEmpty 
      ? data.map((e) => e.bloodSugar).reduce((a, b) => a + b) / data.length 
      : 0.0;
  int avgHighPress = data.isNotEmpty 
      ? data.map((e) => e.bloodPressHigh).reduce((a, b) => a + b) ~/ data.length 
      : 0;
  int avgLowPress = data.isNotEmpty 
      ? data.map((e) => e.bloodPressLow).reduce((a, b) => a + b) ~/ data.length 
      : 0;
  
  return """
  【老人健康周报】
  监测周期:${DateTime.now().subtract(Duration(days: 7)).toString().substring(0,10)} - ${DateTime.now().toString().substring(0,10)}
  平均高压:${avgHighPress}mmHg(参考值90-140)
  平均低压:${avgLowPress}mmHg(参考值60-90)
  平均血糖:${avgBloodSugar.toStringAsFixed(1)}mmol/L(参考值3.9-7.0)
  异常提醒:${checkHealthAbnormal(data) ? "存在异常值,请及时关注" : "各项指标均正常"}
  """;
}
// 校验健康数据是否异常
bool checkHealthAbnormal(List<HealthRecord> data) {}

八、实战总结

本次轻量化社区健康体检预约 + 慢病打卡模块,依托 Flutter for OpenHarmony 开发,零硬件成本、易集成、易上架、运维零压力,既能切实解决老年居民体检预约难、吃药漏服、健康数据无记录的痛点,又能帮助子女实现远程健康监护,同时减轻社区卫生室人工预约、健康档案管理的压力,是智慧社区养老便民 APP 的核心刚需功能,全套代码可直接嵌入商用项目快速落地。

该模块贴合社区养老政策导向,落地后易获得街道、物业的支持,是智慧社区项目评优、申报的优质加分项。


📌 下一篇预告

第十篇:Flutter for OpenHarmony 社区便民实战 —— 社区生鲜团购 + 上门配送便民模块

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐