资讯动态

Flutter与鸿蒙结合的药品有效期管理应用开发实践

发布时间:2026/10/26 11:36:54 来源:尧图企业网站定制
1. 项目背景与需求分析在医疗健康领域药品有效期管理一直是个棘手问题。根据美国药典统计全球每年因药品过期造成的浪费高达数十亿美元。传统的手工记录方式不仅效率低下还容易因人为疏忽导致用药安全隐患。这正是我们选择开发药品有效期提醒应用的初衷。Flutter框架的跨平台特性与鸿蒙系统的分布式能力相结合为解决这一问题提供了全新思路。Flutter自2017年发布以来其一次编写多端运行的特性已得到广泛验证。而鸿蒙系统HarmonyOS的原子化服务理念使得应用可以无缝适配手机、平板、智能手表等多种终端设备。这个项目的核心价值在于通过移动端便捷录入药品信息利用本地数据库存储药品数据基于系统级通知实现多设备联动提醒可视化展示药品库存状态2. 技术选型与架构设计2.1 为什么选择Flutter鸿蒙组合在技术选型阶段我们对比了几种主流方案技术方案开发效率性能表现鸿蒙适配性生态成熟度原生鸿蒙开发低高完美低Flutter跨平台高中高需适配高React Native中中需适配中小程序方案高低部分支持高最终选择Flutter主要基于热重载开发体验药品管理界面需要频繁调整布局Flutter的热重载可以极大提升开发效率一致的UI表现确保在Android、HarmonyOS等不同系统上显示效果统一丰富的插件生态如sqflite用于本地存储、flutter_local_notifications用于提醒2.2 应用架构设计我们采用分层架构设计应用层 ├── 用户界面Flutter Widgets ├── 业务逻辑BLoC模式 └── 数据层 ├── 本地存储Hive/SQLite └── 系统服务接口鸿蒙能力调用关键设计决策使用BLoC管理状态便于处理药品的增删改查操作选择Hive而非SQLite作为本地数据库因其在Flutter上的性能更优通过鸿蒙的分布式能力实现跨设备同步3. 核心功能实现细节3.1 药品信息录入模块药品录入界面需要处理多种数据类型class Medicine { final String id; final String name; final String batchNumber; final DateTime productionDate; final int validityPeriod; // 月为单位 final int remainingAmount; final String imageUrl; // 计算属性过期日期 DateTime get expiryDate productionDate.addMonths(validityPeriod); // 计算属性是否即将过期30天内 bool get isExpiringSoon { final daysRemaining expiryDate.difference(DateTime.now()).inDays; return daysRemaining 30 daysRemaining 0; } }实现要点使用image_picker插件支持药品拍照识别通过flutter_barcode_scanner支持条形码扫描表单验证逻辑final _formKey GlobalKeyFormState(); ... TextFormField( validator: (value) { if (value null || value.isEmpty) { return 请输入药品名称; } return null; }, )3.2 本地数据存储方案经过对比测试我们最终选择Hive作为本地存储方案方案读写速度查询能力数据加密适用场景SQLite中强需额外配置复杂查询Hive快一般支持简单KV存储SharedPreferences慢无不支持小数据量Hive的典型使用模式// 初始化 await Hive.initFlutter(); Hive.registerAdapter(MedicineAdapter()); // 打开药品盒子 final medicineBox await Hive.openBoxMedicine(medicines); // 添加药品 medicineBox.add(newMedicine); // 查询即将过期的药品 var expiringSoon medicineBox.values .where((m) m.isExpiringSoon) .toList();重要提示Hive在鸿蒙设备上需要额外配置存储权限在config.json中添加reqPermissions: [ { name: ohos.permission.WRITE_USER_STORAGE } ]3.3 跨平台通知提醒实现通知模块需要处理不同平台的差异Futurevoid scheduleExpiryNotification(Medicine medicine) async { final flutterLocalNotificationsPlugin FlutterLocalNotificationsPlugin(); // 初始化设置 const initializationSettings InitializationSettings( android: AndroidInitializationSettings(app_icon), // 鸿蒙使用Android配置 ); await flutterLocalNotificationsPlugin.initialize( initializationSettings, onSelectNotification: (payload) async { // 通知点击处理 }, ); // 计算提醒时间提前7天 final reminderTime medicine.expiryDate.subtract(Duration(days: 7)); // 设置通知内容 const platformChannelSpecifics NotificationDetails( android: AndroidNotificationDetails( medicine_channel, 药品提醒, channelDescription: 药品有效期提醒通知, importance: Importance.high, priority: Priority.high, ), ); await flutterLocalNotificationsPlugin.schedule( medicine.id.hashCode, // 通知ID 药品即将过期提醒, ${medicine.name}将在${medicine.expiryDate.toString(yyyy-MM-dd)}过期, reminderTime, platformChannelSpecifics, ); }鸿蒙特有优化使用ohos.notification包实现更精准的分布式通知在手表端显示简化版提醒信息支持语音播报提醒需集成华为语音服务4. 鸿蒙特性深度集成4.1 原子化服务封装将核心功能封装为鸿蒙原子化服务实现免安装使用在entry/src/main/module.json5中声明能力abilities: [ { name: MedicineReminder, type: service, backgroundModes: [dataTransfer], visible: true } ]通过FA模型提供快捷入口void _addToHarmonyDesktop() async { if (Platform.isAndroid) { // 实际是鸿蒙设备 const channel MethodChannel(com.example/harmony); await channel.invokeMethod(addShortcut); } }4.2 分布式数据同步利用鸿蒙的分布式数据管理实现多设备同步初始化分布式数据库// 在鸿蒙侧编写Java代码 DistributedDataManager manager DistributedDataManager.getInstance(context); KVManagerConfig config new KVManagerConfig(context); manager.addKVManagerConfig(config);Flutter端通过平台通道调用static const platform MethodChannel(com.example/distributed); Futurevoid syncMedicineData(ListMedicine medicines) async { try { await platform.invokeMethod(syncData, { medicines: medicines.map((m) m.toJson()).toList() }); } on PlatformException catch (e) { print(同步失败: ${e.message}); } }4.3 性能优化实践针对低功耗设备的优化策略列表渲染优化ListView.builder( itemCount: medicines.length, itemBuilder: (context, index) { return MedicineItem( medicine: medicines[index], key: ValueKey(medicines[index].id), // 关键提升Diff效率 ); }, )图片缓存策略dependencies: cached_network_image: ^3.2.0数据库批量操作await Hive.boxMedicine(medicines).putAll( medicines.map((m) MapEntry(m.id, m)).toMap() );5. 实际开发中的挑战与解决方案5.1 Flutter在鸿蒙上的兼容性问题我们遇到的主要问题及解决方案文本输入框异常现象在部分鸿蒙设备上出现输入法遮挡解决方案Scaffold( resizeToAvoidBottomInset: false, // 禁用自动调整 body: SingleChildScrollView( child: Padding( padding: EdgeInsets.only( bottom: MediaQuery.of(context).viewInsets.bottom, ), child: // 表单内容 ), ), )平台视图渲染异常使用PlatformViewLink替代直接嵌入AndroidViewPlatformViewLink( viewType: hybrid-view, surfaceFactory: (context, controller) { return AndroidViewSurface( controller: controller as AndroidViewController, hitTestBehavior: PlatformViewHitTestBehavior.opaque, ); }, onCreatePlatformView: (params) { return PlatformViewsService.initSurfaceAndroidView( id: params.id, viewType: hybrid-view, layoutDirection: TextDirection.ltr, ) ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated) ..create(); }, )5.2 国际化与无障碍适配多语言支持// app_en.arb { medicineName: Medicine Name, expiryAlert: {medicine} will expire on {date} } // app_zh.arb { medicineName: 药品名称, expiryAlert: {medicine}将于{date}过期 }无障碍优化Semantics( label: 药品列表, child: ListView.builder( // ... ), )5.3 测试策略我们建立的测试体系包含单元测试验证业务逻辑test(Medicine expiry calculation, () { final medicine Medicine( productionDate: DateTime(2023, 1, 1), validityPeriod: 12, // 12个月 ); expect(medicine.expiryDate, DateTime(2024, 1, 1)); });Widget测试验证UI交互testWidgets(Add medicine flow, (tester) async { await tester.pumpWidget(MaterialApp(home: AddMedicinePage())); await tester.enterText(find.byType(TextFormField).first, Aspirin); await tester.tap(find.text(保存)); await tester.pump(); expect(find.text(请输入生产日期), findsOneWidget); });集成测试验证端到端流程integrationTest(Full workflow, () async { // 模拟添加药品 // 验证通知设置 // 检查列表显示 });6. 项目部署与发布6.1 多平台打包配置Android/鸿蒙配置android { defaultConfig { applicationId com.example.medreminder minSdkVersion 21 targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } }鸿蒙特有配置 在entry/build-profile.json5中buildOption: { artifactType: hap, apiType: release, runtimeOS: HarmonyOS }6.2 应用签名鸿蒙应用签名流程生成密钥库keytool -genkeypair -alias medreminder -keyalg RSA -keysize 2048 \ -validity 3650 -keystore medreminder.p12在DevEco Studio中配置签名File Project Structure Signing Configs6.3 应用市场发布同时发布到多个平台华为应用市场含鸿蒙专区Google Play Store苹果App Store需额外iOS构建发布检查清单[ ] 隐私政策链接[ ] 应用截图多设备尺寸[ ] 多语言描述[ ] 年龄分级设置[ ] 内容分级问卷7. 项目扩展方向基于现有架构还可以扩展以下功能药品智能识别集成ML Kit实现药品图片分类条形码查询药品数据库家庭共享使用鸿蒙分布式能力共享药品清单设置家庭成员用药提醒用药记录记录每次用药情况生成用药报告云端备份集成华为云服务支持多设备同步技术实现路径graph TD A[现有核心功能] -- B[药品识别] A -- C[家庭共享] A -- D[用药记录] B -- E[ML Kit集成] C -- F[分布式DB] D -- G[图表库]注实际文章中不应包含mermaid图表此处仅为说明技术路线8. 开发经验总结在这个项目开发过程中我们积累了一些关键经验混合开发模式Flutter负责UI和业务逻辑鸿蒙原生代码提供系统级能力通过平台通道实现双向通信状态管理选择简单场景Provider中等复杂度BLoC大型应用Riverpod性能监控void main() { FlutterError.onError (details) { // 上报错误日志 }; runApp( DevicePreview( enabled: !kReleaseMode, builder: (context) MyApp(), ), ); }持续集成使用GitHub Actions自动化构建鸿蒙DevEco云测试服务自定义Lint规则检查代码质量这个项目证实了Flutter鸿蒙技术栈在医疗健康领域的可行性。后续我们将继续优化以下方面提升分布式数据同步的可靠性完善无障碍访问体验探索更多鸿蒙原子化服务场景

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑