ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

基于Flutter的老年人用药提醒APP的设计与实现

基于Flutter的老年人用药提醒APP的设计与实现 一、背景与意义随着人口老龄化进程的加速老年人慢性病患病率持续上升多药并用现象普遍。然而老年人记忆力减退、视力下降等问题导致漏服、错服、重复服药等用药安全问题频发严重影响治疗效果与生命安全。传统的纸质药盒、口头提醒等方式已难以满足精准、智能的用药管理需求。在此背景下开发一款基于移动端的老年人用药提醒APP具有重要的现实意义提升用药依从性通过定时提醒、语音播报等功能有效减少漏服、忘服情况。保障用药安全记录用药历史、设置禁忌提醒避免药物相互作用与重复用药风险。减轻照护负担为子女或护工提供远程查看与管理入口实现“科技助老”。促进健康管理整合用药数据为健康评估与就医提供参考。选择Flutter框架进行跨平台开发可以一次性构建iOS与Android应用大幅降低开发与维护成本快速响应市场需求。二、技术栈选型本项目采用Flutter为核心框架结合一系列成熟的插件与后端服务构建稳定、高效的应用。类别技术/组件说明核心框架Flutter 3.xGoogle开源的UI工具包用于构建跨平台原生应用。状态管理Provider / Riverpod用于管理应用全局状态如用户信息、药品列表实现数据响应式更新。本地存储sqflite / Hive用于持久化存储药品信息、用药记录、用户设置等数据。网络请求Dio强大的HTTP客户端用于与后端API交互如同步数据、获取药品库。推送与本地通知flutter_local_notifications实现定时用药提醒的本地通知功能确保离线可用。权限管理permission_handler处理应用所需的通知、存储等系统权限。日期时间intl用于日期格式化与本地化。UI组件库Flutter Material/Cupertino提供丰富的预置组件快速构建符合设计规范且对老年人友好的大字体、高对比度界面。后端可选Firebase / 自建Node.js用于实现用户认证、数据云同步、家庭共享等高级功能。三、核心功能模块设计APP主要包含以下核心模块药品管理添加/编辑药品名称、剂量、图片、用法。用药计划为每种药品设置提醒时间、频率每日、每周特定天、疗程。提醒中心基于本地通知触发用药提醒支持重复提醒、用药确认记录。用药记录日历视图展示历史用药情况已服、漏服。个人中心用户设置、紧急联系人、健康档案。家庭共享可选绑定家庭成员远程查看老人用药情况。四、核心代码实现示例1. 数据模型定义 (Medicine)class Medicine { int? id; String name; String dosage; // 如“一次一片” String? imagePath; ListString weekdays; // 每周哪几天服药如[Mon, Wed, Fri] ListTimeOfDay reminderTimes; // 每天的服药时间点 DateTime startDate; DateTime? endDate; bool isActive; Medicine({ this.id, required this.name, required this.dosage, this.imagePath, required this.weekdays, required this.reminderTimes, required this.startDate, this.endDate, this.isActive true, }); MapString, dynamic toMap() { return { id: id, name: name, dosage: dosage, imagePath: imagePath, weekdays: jsonEncode(weekdays), reminderTimes: jsonEncode(reminderTimes.map((t) ${t.hour}:${t.minute}).toList()), startDate: startDate.toIso8601String(), endDate: endDate?.toIso8601String(), isActive: isActive ? 1 : 0, }; } // fromMap 工厂方法省略... }2. 本地通知服务 (ReminderService)import package:flutter_local_notifications/flutter_local_notifications.dart; class ReminderService { static final FlutterLocalNotificationsPlugin _notificationsPlugin FlutterLocalNotificationsPlugin(); static Futurevoid initialize() async { const AndroidInitializationSettings initializationSettingsAndroid AndroidInitializationSettings(mipmap/ic_launcher); final InitializationSettings initializationSettings InitializationSettings(android: initializationSettingsAndroid); await _notificationsPlugin.initialize(initializationSettings); } // 为单个药品的某个时间点设置每日重复提醒 static Futurevoid scheduleDailyReminder( int medicineId, String medicineName, TimeOfDay time) async { final now DateTime.now(); final scheduledTime DateTime( now.year, now.month, now.day, time.hour, time.minute); // 如果设定时间已过则从明天开始 if (scheduledTime.isBefore(now)) { scheduledTime.add(const Duration(days: 1)); } const AndroidNotificationDetails androidPlatformChannelSpecifics AndroidNotificationDetails( medicine_reminder_channel, 用药提醒, importance: Importance.max, priority: Priority.high, playSound: true, sound: RawResourceAndroidNotificationSound(alert), ); await _notificationsPlugin.zonedSchedule( medicineId * 100 time.hour, // 生成唯一ID 用药时间到, 请服用$medicineName, _scheduleDaily(scheduledTime), const NotificationDetails(android: androidPlatformChannelSpecifics), androidAllowWhileIdle: true, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, matchDateTimeComponents: DateTimeComponents.time, ); } static TZDateTime _scheduleDaily(DateTime scheduledTime) { return TZDateTime.from(scheduledTime, local); } // 取消某个药品的所有提醒 static Futurevoid cancelRemindersForMedicine(int medicineId) async { // 假设我们为每个时间点生成的ID规则已知 for (int hour in [8, 12, 18, 21]) { // 示例时间 await _notificationsPlugin.cancel(medicineId * 100 hour); } } }3. 主页面状态管理与UI (MedicineListPage)import package:flutter/material.dart; import package:provider/provider.dart; import medicine.dart; import medicine_database.dart; class MedicineListPage extends StatelessWidget { override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text(我的药品), actions: [ IconButton( icon: const Icon(Icons.add), onPressed: () Navigator.pushNamed(context, /addMedicine), ), ], ), body: FutureBuilderListMedicine( future: Provider.ofMedicineDatabase(context, listen: false).getAllMedicines(), builder: (context, snapshot) { if (snapshot.connectionState ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } if (!snapshot.hasData || snapshot.data!.isEmpty) { return const Center(child: Text(暂无药品请点击右上角添加)); } final medicines snapshot.data!; return ListView.builder( itemCount: medicines.length, itemBuilder: (context, index) { final medicine medicines[index]; return Card( child: ListTile( leading: medicine.imagePath ! null ? CircleAvatar(backgroundImage: FileImage(File(medicine.imagePath!))) : const CircleAvatar(child: Icon(Icons.medication)), title: Text( medicine.name, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), subtitle: Text(剂量${medicine.dosage}), trailing: Switch( value: medicine.isActive, onChanged: (value) async { // 更新药品激活状态并同步提醒 await Provider.ofMedicineDatabase(context, listen: false) .updateMedicine(medicine.copyWith(isActive: value)); if (value) { // 重新激活提醒 for (var time in medicine.reminderTimes) { ReminderService.scheduleDailyReminder(medicine.id!, medicine.name, time); } } else { ReminderService.cancelRemindersForMedicine(medicine.id!); } }, ), onTap: () Navigator.pushNamed(context, /medicineDetail, arguments: medicine.id), ), ); }, ); }, ), ); } }五、总结与展望本文介绍了基于Flutter开发老年人用药提醒APP的技术方案。通过合理的技术栈选型与模块化设计可以高效构建出界面友好、功能实用的应用。核心在于稳定的本地通知提醒与简洁直观的数据管理。未来可拓展方向包括接入智能语音助手进行语音交互、集成健康设备数据、引入用药知识图谱进行智能警示、开发Web管理端供医护人员使用等从而打造更全面的智慧养老健康管理平台。
返回列表