Flutter健康临床记录访问插件apple_health_clinical_records的使用
Flutter健康临床记录访问插件apple_health_clinical_records的使用
Apple Health Clinical Records
此插件允许从Apple健康读取临床记录。
iOS | |
---|---|
支持 | 12.0+ |
该插件支持以下功能:
- 使用
checkIfHealthDataAvailable
方法检查Apple健康是否可用。 - 使用
hasAuthorization
和requestAuthorization
方法处理访问临床记录的权限。 - 使用
getData
方法读取临床记录。
数据类型
数据类型 | FHIR资源 | 备注 |
---|---|---|
condition | Condition | |
allergy | AllergyIntolerance | |
coverage | 需要iOS 14.0+ | |
immunization | Immunization | |
labResult | Observation | |
medication | MedicationOrder | |
procedure | Procedure | |
vitalSign | Observation |
设置
首先,在pubspec.yaml
文件中添加apple_health_clinical_records
作为依赖项。
iOS
步骤1:在Info.plist文件中添加以下条目:
<key>NSHealthClinicalHealthRecordsShareUsageDescription</key>
<string>您的临床记录使用描述</string>
步骤2:在“能力”选项卡中启用“HealthKit”。
步骤3:为“HealthKit”启用“Clinical Health Records”。
使用
查看示例应用程序以了解如何详细使用临床记录API。
通过AppleHealthClinicalRecords
类使用不同的方法来处理权限并从Apple健康获取记录。
// 创建一个AppleHealthClinicalRecords实例
AppleHealthClinicalRecords clinicalRecords = AppleHealthClinicalRecords();
// 检查Apple健康是否可用
bool available = await clinicalRecords.checkIfHealthDataAvailable() ?? false;
// 定义要获取的类型
var types = [
ClinicalType.allergy
];
// 检查定义类型的权限是否已授予
final futures = types.map((type) => clinicalRecords.hasAuthorization(type));
final authorizations = await Future.wait(futures);
if (authorizations.every((element) => true)) {
getClinicalData(types);
} else {
// 请求授权
bool authorized = await clinicalRecords.requestAuthorization(types) ?? false;
if (authorized) {
getClinicalData(types);
}
}
void getClinicalData(List<ClinicalType> types) async {
final records = types.map((type) => clinicalRecords.getData(type));
final data = await Future.wait(records);
}
临床记录
临床记录包含列表中的FHIR资源,包括上述列出的数据类型。
查看FHIR资源列表
参考
受Health插件启发。
示例代码
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:apple_health_clinical_records/apple_health_clinical_records.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final _appleHealthClinicalRecordsPlugin = AppleHealthClinicalRecords();
[@override](/user/override)
void initState() {
super.initState();
initPlatformState();
}
Future<void> initPlatformState() async {
try {
// 首先检查Apple Health是否可用
final available = await _appleHealthClinicalRecordsPlugin
.checkIfHealthDataAvailable() ??
false;
debugPrint(available ? '可用' : '不可用');
if (available) {
// 然后检查所需临床类型的授权状态
final futures = ClinicalType.values.map(
(type) => _appleHealthClinicalRecordsPlugin.hasAuthorization(type));
final statuses = await Future.wait(futures);
var authStatus = false;
if (statuses.any((element) => element != true)) {
// 一些或更多临床类型未授权
var types = [ClinicalType.allergy];
authStatus = await _appleHealthClinicalRecordsPlugin
.requestAuthorization(ClinicalType.values) ??
false;
}
debugPrint(authStatus.toString());
if (authStatus) {
final records = ClinicalType.values
.map((type) => _appleHealthClinicalRecordsPlugin.getData(type));
final data = await Future.wait(records);
debugPrint(data.toString());
}
}
} on PlatformException catch (err) {
debugPrint(err.toString());
}
// 如果在异步平台消息飞行时小部件从树中被移除,则我们希望丢弃回复而不是调用setState来更新我们的非存在外观。
if (!mounted) return;
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('插件示例应用'),
),
body: Center(
child: Text('运行于:'),
),
),
);
}
}
更多关于Flutter健康临床记录访问插件apple_health_clinical_records的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter健康临床记录访问插件apple_health_clinical_records的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何使用 apple_health_clinical_records
插件在 Flutter 中访问 Apple Health 临床记录的示例代码。这个插件允许你从 Apple HealthKit 中获取临床记录数据,比如过敏信息、免疫记录、医疗状况等。
首先,你需要确保你的 Flutter 项目中已经添加了 apple_health_clinical_records
插件。你可以通过以下命令在你的 pubspec.yaml
文件中添加该插件:
dependencies:
flutter:
sdk: flutter
apple_health_clinical_records: ^最新版本号
然后运行 flutter pub get
来获取依赖。
接下来,你需要配置你的 iOS 项目以启用 HealthKit 访问。在你的 ios/Runner/Info.plist
文件中,添加以下权限请求:
<key>NSHealthShareUsageDescription</key>
<string>我们需要访问您的健康记录来提供更好的健康服务。</string>
<key>NSHealthUpdateUsageDescription</key>
<string>我们需要更新您的健康记录以提供更好的健康服务。</string>
确保你的 App ID 在 Apple Developer 账户中启用了 HealthKit 功能,并在 Xcode 中配置了相应的 Capabilities。
接下来是 Flutter 代码示例,展示如何请求权限并访问临床记录:
import 'package:flutter/material.dart';
import 'package:apple_health/apple_health.dart';
import 'package:apple_health_clinical_records/apple_health_clinical_records.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
AppleHealth? appleHealth;
List<ClinicalRecordCategory>? clinicalRecords;
@override
void initState() {
super.initState();
_setupAppleHealth();
}
Future<void> _setupAppleHealth() async {
appleHealth = AppleHealth(
scopes: [
.clinicalRecordsRead,
],
);
bool isAuthorized = await appleHealth!.requestAuthorization();
if (isAuthorized) {
clinicalRecords = await fetchClinicalRecords();
setState(() {});
} else {
// 处理未授权情况
print("用户未授权访问临床记录");
}
}
Future<List<ClinicalRecordCategory>?> fetchClinicalRecords() async {
List<ClinicalRecordCategory> records = [];
// 示例:获取过敏信息
try {
List<AllergyRecord> allergies = await appleHealth!.clinicalRecords.fetchAllergies();
records.add(ClinicalRecordCategory(
title: "过敏信息",
records: allergies.map((allergy) => ClinicalRecord(
date: allergy.date,
detail: allergy.reaction?.description ?? "无描述",
)).toList(),
));
} catch (e) {
print("获取过敏信息失败: $e");
}
// 示例:获取免疫记录
try {
List<ImmunizationRecord> immunizations = await appleHealth!.clinicalRecords.fetchImmunizations();
records.add(ClinicalRecordCategory(
title: "免疫记录",
records: immunizations.map((immunization) => ClinicalRecord(
date: immunization.date,
detail: immunization.vaccineType?.localizedName ?? "无疫苗类型",
)).toList(),
));
} catch (e) {
print("获取免疫记录失败: $e");
}
// 你可以继续添加其他类型的临床记录获取代码
return records;
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('临床记录示例'),
),
body: clinicalRecords == null
? Center(child: CircularProgressIndicator())
: ListView.builder(
itemCount: clinicalRecords!.length,
itemBuilder: (context, index) {
ClinicalRecordCategory category = clinicalRecords![index];
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
category.title,
style: TextStyle(fontWeight: FontWeight.bold),
),
SizedBox(height: 8),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: category.records.map((record) => Text(
"${record.date.toLocal().toDateString()}: ${record.detail}",
)).toList(),
),
SizedBox(height: 16),
],
);
}),
),
);
}
}
class ClinicalRecordCategory {
String title;
List<ClinicalRecord> records;
ClinicalRecordCategory({required this.title, required this.records});
}
class ClinicalRecord {
DateTime date;
String detail;
ClinicalRecord({required this.date, required this.detail});
}
注意:
- 代码中使用了
AppleHealth
插件的基础功能来请求授权。apple_health_clinical_records
插件依赖于apple_health
插件。 - 示例中展示了如何获取过敏信息和免疫记录,你可以根据需要添加其他类型的临床记录获取代码。
- 请确保你理解并遵守 Apple 的隐私政策和 HealthKit 的使用条款。
希望这个示例能帮助你更好地理解和使用 apple_health_clinical_records
插件。