Flutter健康临床记录访问插件apple_health_clinical_records的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter健康临床记录访问插件apple_health_clinical_records的使用

Apple Health Clinical Records

此插件允许从Apple健康读取临床记录。

iOS
支持 12.0+

该插件支持以下功能:

  • 使用checkIfHealthDataAvailable方法检查Apple健康是否可用。
  • 使用hasAuthorizationrequestAuthorization方法处理访问临床记录的权限。
  • 使用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”。

Clinical Health Records in HealthKit

使用

查看示例应用程序以了解如何详细使用临床记录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插件启发。

FHIR资源列表

Apple HealthKit文档

Apple HealthKit文档


示例代码

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

1 回复

更多关于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});
}

注意

  1. 代码中使用了 AppleHealth 插件的基础功能来请求授权。apple_health_clinical_records 插件依赖于 apple_health 插件。
  2. 示例中展示了如何获取过敏信息和免疫记录,你可以根据需要添加其他类型的临床记录获取代码。
  3. 请确保你理解并遵守 Apple 的隐私政策和 HealthKit 的使用条款。

希望这个示例能帮助你更好地理解和使用 apple_health_clinical_records 插件。

回到顶部