Flutter家庭用药清单:智能管理家庭药品
项目简介
家庭用药清单是一款实用的Flutter应用,帮助家庭管理药品库存、追踪有效期、记录用药信息。通过智能提醒功能,避免使用过期药品,确保用药安全。
运行效果图



核心功能
- 药品管理:添加、编辑、删除药品信息
- 分类管理:感冒发烧、消化系统、心脑血管等6大分类
- 库存管理:快速调整药品数量
- 过期提醒:自动识别已过期和即将过期药品
- 详细信息:记录规格、用法、用量、频率
- 数据持久化:本地保存所有数据
- 智能排序:按过期时间自动排序
技术特点
- Material Design 3设计风格
- 状态颜色区分(红色/橙色/绿色)
- Badge徽章提醒
- 响应式卡片布局
- SharedPreferences数据持久化
核心代码实现
1. 药品数据模型
dart
class Medicine {
String id;
String name;
String category;
String specification;
int quantity;
String unit;
DateTime expiryDate;
String usage;
String dosage;
String frequency;
String notes;
DateTime purchaseDate;
bool get isExpired {
return DateTime.now().isAfter(expiryDate);
}
bool get isExpiringSoon {
final days = daysUntilExpiry;
return days <= 90 && days >= 0;
}
int get daysUntilExpiry {
return expiryDate.difference(DateTime.now()).inDays;
}
}
模型字段说明:
id:唯一标识符name:药品名称category:分类specification:规格quantity:数量unit:单位expiryDate:有效期usage:用法dosage:用量frequency:频率notes:备注purchaseDate:购买日期
计算属性:
isExpired:是否已过期isExpiringSoon:是否即将过期(90天内)daysUntilExpiry:距离过期天数
2. 过期状态判断
dart
Color statusColor;
String statusText;
IconData statusIcon;
if (medicine.isExpired) {
statusColor = Colors.red;
statusText = '已过期';
statusIcon = Icons.error;
} else if (medicine.isExpiringSoon) {
statusColor = Colors.orange;
statusText = '即将过期';
statusIcon = Icons.warning;
} else {
statusColor = Colors.green;
statusText = '正常';
statusIcon = Icons.check_circle;
}
3. Badge徽章提醒
dart
final expiredCount = _medicines.where((m) => m.isExpired).length;
final expiringSoonCount = _medicines.where((m) => m.isExpiringSoon).length;
if (expiredCount > 0 || expiringSoonCount > 0)
IconButton(
icon: Badge(
label: Text('${expiredCount + expiringSoonCount}'),
child: const Icon(Icons.warning),
),
onPressed: _showAlerts,
),
4. 快速数量调整
dart
void _updateQuantity(Medicine medicine, int change) {
setState(() {
medicine.quantity = (medicine.quantity + change).clamp(0, 999);
});
_saveMedicines();
}
// UI部分
Row(
children: [
IconButton(
icon: const Icon(Icons.remove_circle_outline),
onPressed: () => _updateQuantity(medicine, -1),
color: Colors.red,
),
Text('数量: ${medicine.quantity}'),
IconButton(
icon: const Icon(Icons.add_circle_outline),
onPressed: () => _updateQuantity(medicine, 1),
color: Colors.green,
),
],
)
5. 日期选择器
dart
Card(
child: ListTile(
leading: const Icon(Icons.calendar_today),
title: const Text('有效期至'),
subtitle: Text(
'${_expiryDate.year}-${_expiryDate.month.toString().padLeft(2, '0')}-${_expiryDate.day.toString().padLeft(2, '0')}',
),
trailing: const Icon(Icons.chevron_right),
onTap: () async {
final picked = await showDatePicker(
context: context,
initialDate: _expiryDate,
firstDate: DateTime.now(),
lastDate: DateTime.now().add(const Duration(days: 3650)),
);
if (picked != null) {
setState(() {
_expiryDate = picked;
});
}
},
),
),
技术要点详解
Badge组件
Badge是Material 3中的徽章组件,用于显示通知数量:
dart
Badge(
label: Text('5'),
child: Icon(Icons.notifications),
)
// 小红点样式
Badge(
child: Icon(Icons.message),
)
clamp方法
用于限制数值范围:
dart
int value = 150;
int clamped = value.clamp(0, 100); // 结果为100
_quantity = (_quantity + change).clamp(0, 999); // 限制在0-999之间
where过滤
Dart的集合过滤方法:
dart
// 过滤已过期药品
final expired = _medicines.where((m) => m.isExpired).toList();
// 过滤即将过期药品
final expiringSoon = _medicines.where((m) => m.isExpiringSoon).toList();
// 按分类过滤
final filtered = _medicines.where((m) => m.category == '感冒发烧').toList();
功能扩展建议
1. 用药提醒
添加定时提醒功能:
dart
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
class MedicationReminder {
String medicineId;
List<TimeOfDay> times;
List<int> weekdays;
Future<void> scheduleNotification() async {
// 设置定时通知
}
}
2. 用药记录
记录每次用药情况:
dart
class MedicationRecord {
String medicineId;
DateTime takenTime;
String dosage;
String notes;
}
3. 数据导出
导出药品清单为Excel或PDF:
dart
import 'package:excel/excel.dart';
Future<void> exportToExcel(List<Medicine> medicines) async {
var excel = Excel.createExcel();
Sheet sheet = excel['药品清单'];
sheet.appendRow(['名称', '分类', '数量', '有效期']);
for (var medicine in medicines) {
sheet.appendRow([
medicine.name,
medicine.category,
'${medicine.quantity}${medicine.unit}',
medicine.expiryDate.toString(),
]);
}
// 保存文件
}
4. 扫码添加
通过扫描药品条形码自动添加:
dart
import 'package:mobile_scanner/mobile_scanner.dart';
Future<void> scanBarcode() async {
// 扫描条形码
// 查询药品数据库
// 自动填充药品信息
}
5. 家庭成员管理
为不同家庭成员管理药品:
dart
class FamilyMember {
String id;
String name;
List<String> medicineIds;
}
常见问题解答
Q1: 如何批量删除过期药品?
A: 添加批量操作功能:
dart
void _deleteExpiredMedicines() {
setState(() {
_medicines.removeWhere((m) => m.isExpired);
});
_saveMedicines();
}
Q2: 如何设置自定义过期提醒天数?
A: 添加设置选项:
dart
int _expiryWarningDays = 90;
bool get isExpiringSoon {
final days = daysUntilExpiry;
return days <= _expiryWarningDays && days >= 0;
}
Q3: 如何添加药品图片?
A: 集成image_picker:
dart
import 'package:image_picker/image_picker.dart';
class Medicine {
// ... 其他字段
String photoPath;
}
Future<void> _pickImage() async {
final picker = ImagePicker();
final pickedFile = await picker.pickImage(source: ImageSource.camera);
if (pickedFile != null) {
setState(() {
_photoPath = pickedFile.path;
});
}
}
项目总结
实现的功能
✅ 药品信息管理
✅ 6大分类管理
✅ 库存快速调整
✅ 过期自动提醒
✅ 详细用药信息
✅ 数据本地持久化
✅ 智能状态标识
✅ Badge徽章提醒
技术亮点
- 智能提醒:自动识别过期药品
- 快速操作:一键调整数量
- 状态可视化:颜色区分药品状态
- Badge徽章:醒目的提醒标识
- 数据持久化:完整的JSON序列化
应用场景
- 👨👩👧👦 家庭药品管理
- 🏥 个人健康管理
- 👴 老年人用药提醒
- 💊 慢性病用药追踪
- 🏠 家庭医药箱整理
家庭用药清单是一款实用的健康管理应用,帮助家庭安全、有效地管理药品。通过智能提醒功能,避免使用过期药品,保障用药安全。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net