Flutter 框架跨平台鸿蒙开发 - 家庭用药清单:智能管理家庭药品

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徽章提醒

技术亮点

  1. 智能提醒:自动识别过期药品
  2. 快速操作:一键调整数量
  3. 状态可视化:颜色区分药品状态
  4. Badge徽章:醒目的提醒标识
  5. 数据持久化:完整的JSON序列化

应用场景

  • 👨‍👩‍👧‍👦 家庭药品管理
  • 🏥 个人健康管理
  • 👴 老年人用药提醒
  • 💊 慢性病用药追踪
  • 🏠 家庭医药箱整理

家庭用药清单是一款实用的健康管理应用,帮助家庭安全、有效地管理药品。通过智能提醒功能,避免使用过期药品,保障用药安全。

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

相关推荐
纯爱掌门人2 小时前
鸿蒙端云一体化开发(二):云数据库
数据库·华为·harmonyos·端云一体化
kirk_wang2 小时前
Flutter艺术探索-GetX框架使用指南:轻量级状态管理
flutter·移动开发·flutter教程·移动开发教程
小雨青年2 小时前
【鸿蒙原生开发会议随记 Pro】 数据存储架构 RelationalStore 在复杂资产管理中的应用
华为·架构·harmonyos
雨季6663 小时前
使用 Flutter for OpenHarmony 构建基础 UI 组件布局:从 Scaffold 到 Container 的实战解析
flutter·ui
时光慢煮3 小时前
基于 Flutter × OpenHarmony 的文件管家 —— 构建文件类型分类区域
flutter·华为·开源·openharmony
时光慢煮4 小时前
跨端文件管理:Flutter 与 OpenHarmony 搜索栏实战
flutter·华为·开源·openharmony
djarmy4 小时前
跨平台Flutter 开源鸿蒙开发指南(三):使用thirdParty的dio库实现网络请求 示例
flutter·华为·harmonyos
Miguo94well4 小时前
Flutter框架跨平台鸿蒙开发——护眼提醒APP的开发流程
flutter·华为·harmonyos·鸿蒙
腥臭腐朽的日子熠熠生辉5 小时前
Flutter 无限滚动组件实现ListView
flutter