health_connector 2.4.0 copy "health_connector: ^2.4.0" to clipboard
health_connector: ^2.4.0 copied to clipboard

The most comprehensive Flutter health plugin for seamless iOS HealthKit and Android Health Connect integration.

health_connector #

Pub Version Pub Points License Platform

The most complete Flutter health SDK โ€” unified, type-safe access to 100+ health data types across iOS HealthKit and Android Health Connect.


๐Ÿ“– Table of Contents #


๐ŸŽฎ See It In Action โ€” Interactive Toolbox Demo #

See what's possible. The Health Connector Toolbox showcases the full power of the SDK with live, interactive demonstrations running on both iOS and Android.

๐Ÿ” Permissions ๐Ÿ“– Read โœ๏ธ Write ๐Ÿ—‘๏ธ Delete ๐Ÿ“Š Aggregate
Permission Request Read Data Write Data Delete Data Aggregate Data
Permission Request Read Data Write Data Delete Data Aggregate Data

๐Ÿš€ Try It Yourself #

git clone https://github.com/fam-tung-lam/health_connector.git
cd health_connector/examples/health_connector_toolbox
flutter pub get && flutter run

Explore:

  • ๐Ÿ” Permission flows for HealthKit & Health Connect
  • ๐Ÿ“Š Real-time health data visualization
  • โœ๏ธ CRUD operations with live feedback
  • ๐Ÿงช Feature detection and platform capabilities

๐Ÿ’ก Note: The toolbox is a demonstration toolโ€”perfect for exploring APIs, not for production reference.


๐Ÿš€ Quick Start #

๐Ÿ“‹ Requirements #

Platform Minimum Version
Android API 26+
iOS โ‰ฅ15.0

๐Ÿ“ฆ Installation #

flutter pub add health_connector

Or add manually to pubspec.yaml:

dependencies:
  health_connector: [latest_version]

๐Ÿ”ง Platform Setup #

๐Ÿค– Android Health Connect Setup
Step 1: Update AndroidManifest.xml

Add to android/app/src/main/AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
        <!-- Your existing configuration -->

        <!-- Health Connect intent filter for showing permissions rationale -->
        <activity-alias
            android:name="ViewPermissionUsageActivity"
            android:exported="true"
            android:targetActivity=".MainActivity"
            android:permission="android.permission.START_VIEW_PERMISSION_USAGE">
            <intent-filter>
                <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
            </intent-filter>
        </activity-alias>
    </application>

    <!-- Declare Health Connect permissions for each data type you use -->

    <!-- Read permissions -->
    <uses-permission android:name="android.permission.health.READ_STEPS" />
    <uses-permission android:name="android.permission.health.READ_WEIGHT" />
    <uses-permission android:name="android.permission.health.READ_HEART_RATE" />
    <!-- Add more read permissions... -->
    
    <!-- Write permissions -->
    <uses-permission android:name="android.permission.health.WRITE_STEPS" />
    <uses-permission android:name="android.permission.health.WRITE_WEIGHT" />
    <uses-permission android:name="android.permission.health.WRITE_HEART_RATE" />
    <!-- Add more write permissions... -->

    <!-- Feature permissions -->
    <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND" />
    <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_HISTORY" />
    <!-- Add more feature permissions... -->
</manifest>

โ— Important: You must declare a permission for each health data type and feature your app accesses. See the Health Connect data types list for all available permissions.

Step 2: Update MainActivity (Android 14+)

This SDK uses the modern registerForActivityResult API when requesting permissions from Health Connect. For this to work correctly, your app's MainActivity must extend FlutterFragmentActivity instead of FlutterActivity. This is required because registerForActivityResult is only available in ComponentActivity and its subclasses.

Update android/app/src/main/kotlin/.../MainActivity.kt:

package com.example.yourapp

import io.flutter.embedding.android.FlutterFragmentActivity

class MainActivity: FlutterFragmentActivity() {
    // Your existing code
}
Step 3: Enable AndroidX

Health Connect is built on AndroidX libraries. android.useAndroidX=true enables AndroidX support, and android.enableJetifier=true automatically migrates third-party libraries to use AndroidX.

Update android/gradle.properties:

# Your existing configuration

android.enableJetifier=true
android.useAndroidX=true
Step 4: Set Minimum Android Version

Health Connect requires Android 8.0 (API 26) or higher. Update android/app/build.gradle:

android {
    // Your existing configuration

    defaultConfig {
        // Your existing configuration

        minSdkVersion 26  // Required for Health Connect
    }
}
๐ŸŽ iOS HealthKit Setup
Step 1: Configure Xcode
  1. Open your project in Xcode (ios/Runner.xcworkspace)
  2. Select your app target
  3. In General tab โ†’ Set Minimum Deployments to 15.0
  4. In Signing & Capabilities tab โ†’ Click + Capability โ†’ Add HealthKit
Step 2: Update Info.plist

Add to ios/Runner/Info.plist:

<dict>
    <!-- Existing keys -->

    <!-- Required: Describe why your app reads health data -->
    <key>NSHealthShareUsageDescription</key>
    <string>This app needs to read your health data to provide personalized insights.</string>

    <!-- Required: Describe why your app writes health data -->
    <key>NSHealthUpdateUsageDescription</key>
    <string>This app needs to save health data to track your progress.</string>
</dict>

โš ๏ธ Warning: Vague or generic usage descriptions may result in App Store rejection. Be specific about what data you access and why.

โšก Quick Demo #

import 'package:health_connector/health_connector.dart';

Future<void> quickStart() async {
  // 1. Check platform availability
  final status = await HealthConnector.getHealthPlatformStatus();
  if (status != HealthPlatformStatus.available) {
    print('Health platform not available: $status');
    return;
  }

  // 2. Create connector instance
  final connector = await HealthConnector.create(
    const HealthConnectorConfig(isLoggerEnabled: true),
  );

  // 3. Request permissions
  final results = await connector.requestPermissions([
    HealthDataType.steps.readPermission,
    HealthDataType.steps.writePermission,
  ]);

  // 4. Verify permissions were granted
  final granted = results.every((r) => r.status != PermissionStatus.denied);
  if (!granted) {
    print('Permissions denied');
    return;
  }

  // 5. Write health data
  final now = DateTime.now();
  final records = [
    _createStepsRecord(now.subtract(Duration(hours: 3)), 1500),
    _createStepsRecord(now.subtract(Duration(hours: 2)), 2000),
    _createStepsRecord(now.subtract(Duration(hours: 1)), 1800),
  ];
  
  final recordIds = await connector.writeRecords(records);
  print('โœ… Wrote ${recordIds.length} records');

  // 6. Read health data
  final response = await connector.readRecords(
    HealthDataType.steps.readInTimeRange(
      startTime: now.subtract(Duration(days: 1)),
      endTime: now,
    ),
  );

  print('๐Ÿ“Š Found ${response.records.length} records:');
  for (final record in response.records) {
    print('  โ†’ ${record.count.value} steps (${record.startTime})');
  }
}

// Helper to create step records
StepsRecord _createStepsRecord(DateTime time, int steps) {
  return StepsRecord(
    startTime: time,
    endTime: time.add(Duration(hours: 1)),
    count: Number(steps),
    metadata: Metadata.automaticallyRecorded(
      dataOrigin: DataOrigin('com.example'),
      device: Device.fromType(DeviceType.phone),
    ),
  );
}

๐Ÿ’ก What's Next? Check out the Developer Guide for full API documentation, error handling, and advanced features.


๐Ÿ“˜ Developer Guide #

๐Ÿ” Permission Management #

Request Permissions

final permissions = [
  HealthDataType.steps.readPermission,
  HealthDataType.steps.writePermission,
  HealthDataType.weight.readPermission,
  HealthPlatformFeature.readHealthDataInBackground.permission,
];

final results = await connector.requestPermissions(permissions);

// Process results
for (final result in results) {
  if (result.status == PermissionStatus.granted) {
    print('โœ… ${result.permission}');
  } else if (result.status == PermissionStatus.unknown) {
    print('โ“ ${result.permission} (iOS read permission)');
  }
}

iOS Privacy: Read permissions always return unknown to prevent apps from inferring whether users have health data.

Check Permission Status

final status = await connector.getPermissionStatus(
  HealthDataType.steps.readPermission,
);

switch (status) {
  case PermissionStatus.granted:
    // Permission granted
  case PermissionStatus.denied:
    // Permission denied
  case PermissionStatus.unknown:
    // iOS read permission (cannot determine)
}

iOS Read Permission Workaround

Strategy: Attempt a minimal read operation and catch NotAuthorizedException.

Future<bool> hasReadPermission(HealthDataType dataType) async {
  try {
    await connector.readRecords(
      dataType.readInTimeRange(
        startTime: DateTime.now().subtract(Duration(days: 1)),
        endTime: DateTime.now(),
        pageSize: 1,
      ),
    );
    return true;  // Read succeeded = permission granted
  } on NotAuthorizedException {
    return false; // Permission denied
  }
}

Disclaimer: Not officially recommended by Apple. Use only if your app genuinely needs to determine read permission status.

Get All Granted Permissions (Android only)

iOS Privacy: HealthKit doesn't allow apps to enumerate granted permissions.

try {
  final granted = await connector.getGrantedPermissions();
  for (final p in granted) {
    print('${p.dataType} (${p.accessType})');
  }
} on UnsupportedOperationException {
  // iOS doesn't support this API
}

Revoke All Permissions (Android only)

iOS Privacy: Not supported by HealthKit. Users must revoke permissions manually via Settings app.

try {
  await connector.revokeAllPermissions();
} on UnsupportedOperationException {
  // iOS users must revoke via Settings app
}

๐Ÿ“– Reading Health Data #

Read by ID

final record = await connector.readRecord(
  HealthDataType.steps.readRecord(HealthRecordId('record-id')),
);

if (record != null) {
  print('โœ… Found: ${record.count.value} steps');
}

Read by Time Range

final response = await connector.readRecords(
  HealthDataType.steps.readInTimeRange(
    startTime: DateTime.now().subtract(Duration(days: 7)),
    endTime: DateTime.now(),
    pageSize: 100,
  ),
);

print('๐Ÿ“Š Found ${response.records.length} records');
for (final record in response.records) {
  print('${record.count.value} steps on ${record.startTime}');
}

Historical Data Access: Android Health Connect defaults to 30 daysโ€”request HealthPlatformFeature.readHealthDataHistory permission for older data. iOS HealthKit has no restrictions.

Paginate Through All Records

var request = HealthDataType.steps.readInTimeRange(
  startTime: DateTime.now().subtract(Duration(days: 30)),
  endTime: DateTime.now(),
  pageSize: 100,
);

final allRecords = <StepsRecord>[];

// Fetch all pages
while (true) {
  final response = await connector.readRecords(request);
  allRecords.addAll(response.records.cast<StepsRecord>());

  // Check if there are more pages
  if (response.nextPageRequest == null) break;
  request = response.nextPageRequest!;
}

print('๐Ÿ“Š Total: ${allRecords.length} records');

๐Ÿ“ค Back to top

โœ๏ธ Writing Health Data #

Write Single Record

final record = StepsRecord(
  id: HealthRecordId.none, // Must be .none for new records
  startTime: DateTime.now().subtract(Duration(hours: 1)),
  endTime: DateTime.now(),
  count: Number(5000),
  metadata: Metadata.automaticallyRecorded(
    device: Device.fromType(DeviceType.phone),
  ),
);

final recordId = await connector.writeRecord(record);
print('โœ… Saved: $recordId');

Batch Write Multiple Records

All records succeed or all fail together:

// Helper to create step records
StepsRecord _createSteps(DateTime time, int steps) => StepsRecord(
  id: HealthRecordId.none,
  startTime: time,
  endTime: time.add(Duration(hours: 1)),
  count: Number(steps),
  metadata: Metadata.automaticallyRecorded(
    device: Device.fromType(DeviceType.phone),
  ),
);

final now = DateTime.now();
final records = [
  _createSteps(now.subtract(Duration(hours: 3)), 1500),
  _createSteps(now.subtract(Duration(hours: 2)), 2000),
  _createSteps(now.subtract(Duration(hours: 1)), 1800),
];

final ids = await connector.writeRecords(records);
print('โœ… Wrote ${ids.length} records');

๐Ÿ“ค Back to top

๐Ÿ”„ Updating Health Records #

iOS Note: HealthKit uses an immutable data modelโ€”records cannot be updated, only deleted and recreated.

Update Single Record (Android only)

final record = await connector.readRecord(
  HealthDataType.steps.readRecord(HealthRecordId('record-id')),
);

if (record != null) {
  await connector.updateRecord(
    record.copyWith(count: Number(record.count.value + 500)),
  );
  print('โœ… Record updated');
}

Batch Update (Android only)

Update multiple records atomicallyโ€”all succeed or all fail.

// Fetch records to update
final response = await connector.readRecords(
  HealthDataType.steps.readInTimeRange(
    startTime: DateTime.now().subtract(Duration(days: 7)),
    endTime: DateTime.now(),
  ),
);

// Apply updates
final updated = response.records.map((r) => 
  r.copyWith(count: Number(r.count.value + 100))
).toList();

await connector.updateRecords(updated);
print('โœ… Updated ${updated.length} records');

iOS Workaround: Delete + Recreate

// Delete existing
await connector.deleteRecords(
  HealthDataType.steps.deleteByIds([existingRecord.id]),
);

// Write new record with updated values
final newRecord = existingRecord.copyWith(
  id: HealthRecordId.none,
  count: Number(newValue),
);

final newId = await connector.writeRecord(newRecord);
// โš ๏ธ Note: ID changes after recreation

๐Ÿ“ค Back to top

๐Ÿ—‘๏ธ Deleting Health Records #

Limitation: Apps can only delete records they createdโ€”platform security restriction.

Delete by IDs

try {
  await connector.deleteRecords(
    HealthDataType.steps.deleteByIds([
      HealthRecordId('id-1'),
      HealthRecordId('id-2'),
    ]),
  );
  print('โœ… Deleted');
} on NotAuthorizedException {
  print('โŒ Cannot delete records from other apps');
}

Delete by Time Range

await connector.deleteRecords(
  HealthDataType.steps.deleteInTimeRange(
    startTime: DateTime.now().subtract(Duration(days: 7)),
    endTime: DateTime.now(),
  ),
);

๐Ÿ“ค Back to top

๐Ÿ“Š Aggregating Health Data #

Example: Sum

final response = await connector.aggregate(
  HealthDataType.steps.aggregateSum(
    startTime: DateTime.now().subtract(Duration(days: 1)),
    endTime: DateTime.now(),
  ),
);

print('๐Ÿ“Š Total steps: ${response.value.value}');

Example: Average, Min, Max

final now = DateTime.now();
final thirtyDaysAgo = now.subtract(Duration(days: 30));

// Get average weight
final avg = await connector.aggregate(
  HealthDataType.weight.aggregateAvg(
    startTime: thirtyDaysAgo,
    endTime: now,
  ),
);

// Get min/max weight
final min = await connector.aggregate(
  HealthDataType.weight.aggregateMin(
    startTime: thirtyDaysAgo,
    endTime: now,
  ),
);

// Get min/max weight
final max = await connector.aggregate(
  HealthDataType.weight.aggregateMax(
    startTime: thirtyDaysAgo,
    endTime: now,
  ),
);

print('Avg: ${avg.value.inKilograms} kg');
print('Min: ${min.value.inKilograms} kg');
print('Max: ${max.value.inKilograms} kg');

๐Ÿ“ค Back to top

โš™๏ธ Feature Management #

Platform Behavior: iOS HealthKit features are always available (built into iOS). Android Health Connect features depend on app versionโ€”check getFeatureStatus() before requesting permissions.

Check Feature Availability

final status = await connector.getFeatureStatus(
  HealthPlatformFeature.readHealthDataInBackground,
);

if (status == HealthPlatformFeatureStatus.available) {
  await connector.requestPermissions([
    HealthPlatformFeature.readHealthDataInBackground.permission,
  ]);
  print('โœ… Feature available and requested');
} else {
  print('โŒ Feature not availableโ€”implement fallback');
}

// Note: iOS always returns 'available', Android returns actual status

๐Ÿ“ค Back to top

โš ๏ธ Error Handling #

Exception Quick Reference

Exception Recovery Strategy
NotAuthorizedException Guide user to System Settings to enable permissions
HealthPlatformUnavailableException Disable health features gracefully (device unsupported)
InvalidConfigurationException Dev error: check AndroidManifest.xml / Info.plist
UnsupportedOperationException Check getFeatureStatus() before calling platform-specific APIs

Standard Exception Handling

try {
  await connector.writeRecord(record);
} on NotAuthorizedException catch (e) {
  print('โŒ Permission denied: ${e.message}');
  // Show UI prompting user to check settings
} on HealthPlatformUnavailableException {
  print('โŒ Health API unavailable on this device');
} on HealthConnectorException catch (e) {
  print('โŒ Error [${e.code}]: ${e.message}');
}

๐Ÿ“ค Back to top

๐Ÿ“ Logging #

Zero-intrusion: Logs are emitted to a stream (HealthConnectorLogger.logs) and never printed automatically. You control the output.

Setup & Subscribing

// 1. Enable logging during initialization
final connector = await HealthConnector.create(
  const HealthConnectorConfig(isLoggerEnabled: true),
);

// 2. Subscribe and filter
HealthConnectorLogger.logs
  .where((log) => log.level == HealthConnectorLogLevel.error) // Optional filter
  .listen((log) {
    print(log.structuredMessage);
    // OR send to Crashlytics:
    // Crashlytics.recordError(log.exception, log.stackTrace, reason: log.message);
  });

Log Structure Example

[HEALTHCONNECTOR] [INFO]:
{
    datetime: 06-01-2026 18:15:32.456,
    message: HealthConnector created successfully,
    operation: create,
    context: { platform: healthConnect },
}

[HEALTHCONNECTOR] [ERROR]:
{
    datetime: 06-01-2026 18:15:34.123,
    message: Failed to read records,
    exception: { cause: NotAuthorizedException... },
}

๐Ÿ“ค Back to top

๐Ÿ”ง Troubleshooting & FAQ #

Issue / Question Platform / Context Solution / Answer
HealthPlatformUnavailableException iOS HealthKit Add HealthKit capability in Xcode โ†’ Signing & Capabilities
HealthPlatformUnavailableException Android Health Connect Device doesn't support Health Connect (requires Android 8.0+)
HealthPlatformNotInstalledOrUpdateRequiredException Android Health Connect Check getHealthPlatformStatus() and call launchHealthAppPageInAppStore() to open Play Store
InvalidConfigurationException Android Health Connect Add required permissions to AndroidManifest.xml
InvalidConfigurationException iOS HealthKit Add NSHealthShareUsageDescription and NSHealthUpdateUsageDescription to Info.plist
Why do iOS read permissions return unknown? iOS HealthKit Apple hides read permission status to protect privacy โ€” apps cannot infer if a user has health data
What's the difference between heartRateSeriesRecord and heartRateMeasurementRecord? Cross-platform Android uses series records (multiple samples in one record); iOS uses individual measurement records
Can I read health data from other apps? Both platforms Yes โ€” with user permission, you can read data from all sources (apps, devices, manual entries)
Can I modify/delete data from other apps? Both platforms No โ€” apps can only modify or delete records they created (platform security restriction)

๐Ÿ“ค Back to top

๐ŸŽฏ Real-World Use Cases #

๐Ÿƒ Fitness Dashboard

// Get daily summary: steps & calories
Future<Map<String, double>> getDailySummary(HealthConnector connector) async {
  final now = DateTime.now();
  final today = DateTime(now.year, now.month, now.day);
  final tomorrow = today.add(Duration(days: 1));

  final steps = await connector.aggregate(
    HealthDataType.steps.aggregateSum(startTime: today, endTime: tomorrow),
  );

  final calories = await connector.aggregate(
    HealthDataType.activeCaloriesBurned.aggregateSum(startTime: today, endTime: tomorrow),
  );

  return {
    'steps': steps.value.value,
    'calories': calories.value.inKilocalories,
  };
}

โค๏ธ Vitals Monitor

Future<void> logVitals(HealthConnector connector) async {
  final weekAgo = DateTime.now().subtract(Duration(days: 7));
  final now = DateTime.now();

  // 1. Get latest weight
  final weight = await connector.readRecords(
    HealthDataType.weight.readInTimeRange(
      startTime: weekAgo, endTime: now, pageSize: 1,
    ),
  );
  if (weight.records.isNotEmpty) {
    print('โš–๏ธ Latest weight: ${(weight.records.first as WeightRecord).weight.inKilograms} kg');
  }

  // 2. Get avg resting heart rate
  final hr = await connector.aggregate(
    HealthDataType.restingHeartRate.aggregateAvg(startTime: weekAgo, endTime: now),
  );
  print('๐Ÿ’“ Avg Resting HR: ${hr.value.inBeatsPerMinute} bpm');
}

๐Ÿฅ— Nutrition Tracker

Future<void> logLunch(HealthConnector connector) async {
  final entry = NutritionRecord(
    id: HealthRecordId.none,
    startTime: DateTime.now().subtract(Duration(minutes: 30)),
    endTime: DateTime.now(),
    name: 'Grilled Chicken Salad',
    energy: Energy.kilocalories(450),
    protein: Mass.grams(40),
    totalCarbohydrate: Mass.grams(12),
    totalFat: Mass.grams(15),
    metadata: Metadata.manual(),
  );

  await connector.writeRecord(entry);
  print('โœ… Meal logged');
}

๐Ÿ“ค Back to top


๐Ÿ“š References #

๐Ÿ“‹ Supported Health Data Types #

๐Ÿƒ Activity

General Activity
Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Steps Number of steps taken HealthDataType.steps Sum StepsRecord HKQuantityTypeIdentifier.stepCount
Active Calories Burned Energy burned through active movement HealthDataType.activeCaloriesBurned Sum ActiveCaloriesBurnedRecord HKQuantityTypeIdentifier.activeEnergyBurned
Floors Climbed Number of floors (flights of stairs) climbed HealthDataType.floorsClimbed Sum FloorsClimbedRecord HKQuantityTypeIdentifier.flightsClimbed
Sexual Activity Sexual activity tracking HealthDataType.sexualActivity - SexualActivityRecord HKCategoryTypeIdentifier.sexualActivity
Wheelchair Pushes Number of wheelchair pushes HealthDataType.wheelchairPushes Sum WheelchairPushesRecord HKQuantityTypeIdentifier.pushCount
Cycling Cadence Cycling pedaling cadence HealthDataType.cyclingPedalingCadence Avg, Min, Max CyclingPedalingCadenceRecord HKQuantityTypeIdentifier.cyclingCadence
Total Calories Burned Total energy burned (active + basal) HealthDataType.totalCaloriesBurned Sum TotalCaloriesBurnedRecord -
Basal Energy Burned Energy burned by basal metabolism HealthDataType.basalEnergyBurned Sum - HKQuantityTypeIdentifier.basalEnergyBurned
Distance Types
Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Distance (generic) Generic distance traveled HealthDataType.distance Sum DistanceRecord -
Walking/Running Distance Distance covered by walking or running HealthDataType.walkingRunningDistance Sum - HKQuantityTypeIdentifier.distanceWalkingRunning
Cycling Distance Distance covered by cycling HealthDataType.cyclingDistance Sum - HKQuantityTypeIdentifier.distanceCycling
Swimming Distance Distance covered by swimming HealthDataType.swimmingDistance Sum - HKQuantityTypeIdentifier.distanceSwimming
Wheelchair Distance Distance covered using a wheelchair HealthDataType.wheelchairDistance Sum - HKQuantityTypeIdentifier.distanceWheelchair
Downhill Snow Sports Distance Distance covered during downhill snow sports HealthDataType.downhillSnowSportsDistance Sum - HKQuantityTypeIdentifier.distanceDownhillSnowSports
Cross Country Skiing Distance Distance covered during cross country skiing HealthDataType.crossCountrySkiingDistance Sum - HKQuantityTypeIdentifier.distanceCrossCountrySkiing
Paddle Sports Distance Distance covered during paddle sports HealthDataType.paddleSportsDistance Sum - HKQuantityTypeIdentifier.distancePaddleSports
Rowing Distance Distance covered during rowing HealthDataType.rowingDistance Sum - HKQuantityTypeIdentifier.distanceRowing
Skating Sports Distance Distance covered during skating sports HealthDataType.skatingSportsDistance Sum - HKQuantityTypeIdentifier.distanceSkatingSports
Six Minute Walk Test Distance Distance covered during 6-minute walk test HealthDataType.sixMinuteWalkTestDistance Sum - HKQuantityTypeIdentifier.sixMinuteWalkTestDistance
Speed Types
Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Speed Series Speed measurements over time HealthDataType.speedSeries - SpeedRecord -
Walking Speed Walking speed measurement HealthDataType.walkingSpeed - - HKQuantityTypeIdentifier.walkingSpeed
Running Speed Running speed measurement HealthDataType.runningSpeed - - HKQuantityTypeIdentifier.runningSpeed
Stair Ascent Speed Speed while climbing stairs HealthDataType.stairAscentSpeed - - HKQuantityTypeIdentifier.stairAscentSpeed
Stair Descent Speed Speed while descending stairs HealthDataType.stairDescentSpeed - - HKQuantityTypeIdentifier.stairDescentSpeed
Power Types
Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Power Series Power measurements over time HealthDataType.powerSeries Avg, Min, Max PowerRecord -
Cycling Power Power output during cycling HealthDataType.cyclingPower Avg, Min, Max - HKQuantityTypeIdentifier.cyclingPower
Exercise Sessions
Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Exercise Session Complete workout session with exercise type and stats HealthDataType.exerciseSession Duration ExerciseSessionRecord HKWorkout
Exercise Types
Exercise Type Android Health Connect iOS HealthKit
ExerciseType.other โœ… โœ…
ExerciseType.running โœ… โœ…
ExerciseType.runningTreadmill โœ… โŒ
ExerciseType.walking โœ… โœ…
ExerciseType.cycling โœ… โœ…
ExerciseType.cyclingStationary โœ… โŒ
ExerciseType.hiking โœ… โœ…
ExerciseType.handCycling โŒ โœ…
ExerciseType.trackAndField โŒ โœ…
ExerciseType.swimming โŒ โœ…
ExerciseType.swimmingOpenWater โœ… โŒ
ExerciseType.swimmingPool โœ… โŒ
ExerciseType.surfing โœ… โœ…
ExerciseType.waterPolo โœ… โœ…
ExerciseType.rowing โœ… โœ…
ExerciseType.sailing โœ… โœ…
ExerciseType.paddling โœ… โœ…
ExerciseType.diving โœ… โœ…
ExerciseType.waterFitness โŒ โœ…
ExerciseType.waterSports โŒ โœ…
ExerciseType.strengthTraining โœ… โœ…
ExerciseType.weightlifting โœ… โŒ
ExerciseType.calisthenics โœ… โŒ
ExerciseType.basketball โœ… โœ…
ExerciseType.soccer โœ… โœ…
ExerciseType.americanFootball โœ… โœ…
ExerciseType.frisbeeDisc โœ… โœ…
ExerciseType.australianFootball โœ… โœ…
ExerciseType.baseball โœ… โœ…
ExerciseType.softball โœ… โœ…
ExerciseType.volleyball โœ… โœ…
ExerciseType.rugby โœ… โœ…
ExerciseType.cricket โœ… โœ…
ExerciseType.handball โœ… โœ…
ExerciseType.iceHockey โœ… โŒ
ExerciseType.rollerHockey โœ… โŒ
ExerciseType.hockey โŒ โœ…
ExerciseType.lacrosse โŒ โœ…
ExerciseType.discSports โŒ โœ…
ExerciseType.tennis โœ… โœ…
ExerciseType.tableTennis โœ… โœ…
ExerciseType.badminton โœ… โœ…
ExerciseType.squash โœ… โœ…
ExerciseType.racquetball โœ… โœ…
ExerciseType.pickleball โŒ โœ…
ExerciseType.skiing โœ… โŒ
ExerciseType.snowboarding โœ… โœ…
ExerciseType.snowshoeing โœ… โŒ
ExerciseType.skating โœ… โœ…
ExerciseType.crossCountrySkiing โŒ โœ…
ExerciseType.curling โŒ โœ…
ExerciseType.downhillSkiing โŒ โœ…
ExerciseType.snowSports โŒ โœ…
ExerciseType.boxing โœ… โœ…
ExerciseType.kickboxing โŒ โœ…
ExerciseType.martialArts โœ… โœ…
ExerciseType.wrestling โŒ โœ…
ExerciseType.fencing โœ… โœ…
ExerciseType.taiChi โŒ โœ…
ExerciseType.dancing โœ… โŒ
ExerciseType.gymnastics โœ… โœ…
ExerciseType.barre โŒ โœ…
ExerciseType.cardioDance โŒ โœ…
ExerciseType.socialDance โŒ โœ…
ExerciseType.yoga โœ… โœ…
ExerciseType.pilates โœ… โœ…
ExerciseType.highIntensityIntervalTraining โœ… โœ…
ExerciseType.elliptical โœ… โœ…
ExerciseType.exerciseClass โœ… โŒ
ExerciseType.bootCamp โœ… โŒ
ExerciseType.guidedBreathing โœ… โŒ
ExerciseType.stairClimbing โœ… โœ…
ExerciseType.crossTraining โŒ โœ…
ExerciseType.jumpRope โŒ โœ…
ExerciseType.fitnessGaming โŒ โœ…
ExerciseType.mixedCardio โŒ โœ…
ExerciseType.cooldown โŒ โœ…
ExerciseType.flexibility โœ… โœ…
ExerciseType.mindAndBody โŒ โœ…
ExerciseType.preparationAndRecovery โŒ โœ…
ExerciseType.stepTraining โŒ โœ…
ExerciseType.coreTraining โŒ โœ…
ExerciseType.golf โœ… โœ…
ExerciseType.archery โŒ โœ…
ExerciseType.bowling โŒ โœ…
ExerciseType.paragliding โœ… โŒ
ExerciseType.climbing โœ… โœ…
ExerciseType.equestrianSports โŒ โœ…
ExerciseType.fishing โŒ โœ…
ExerciseType.hunting โŒ โœ…
ExerciseType.play โŒ โœ…
ExerciseType.wheelchair โœ… โŒ
ExerciseType.wheelchairWalkPace โŒ โœ…
ExerciseType.wheelchairRunPace โŒ โœ…
ExerciseType.transition โŒ โœ…
ExerciseType.swimBikeRun โŒ โœ…

๐Ÿ“ Body Measurements

Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Weight Body weight measurement HealthDataType.weight Avg, Min, Max WeightRecord HKQuantityTypeIdentifier.bodyMass
Height Body height measurement HealthDataType.height Avg, Min, Max HeightRecord HKQuantityTypeIdentifier.height
Body Fat Percentage Percentage of body fat HealthDataType.bodyFatPercentage Avg, Min, Max BodyFatRecord HKQuantityTypeIdentifier.bodyFatPercentage
Lean Body Mass Mass of body excluding fat HealthDataType.leanBodyMass Avg, Min, Max LeanBodyMassRecord HKQuantityTypeIdentifier.leanBodyMass
Body Temperature Core body temperature HealthDataType.bodyTemperature Avg, Min, Max BodyTemperatureRecord HKQuantityTypeIdentifier.bodyTemperature
Body Water Mass Mass of body water HealthDataType.bodyWaterMass Avg, Min, Max BodyWaterMassRecord -
Bone Mass Mass of bone mineral HealthDataType.boneMass Avg, Min, Max BoneMassRecord -
Body Mass Index Body Mass Index (BMI) HealthDataType.bodyMassIndex Avg, Min, Max - HKQuantityTypeIdentifier.bodyMassIndex
Waist Circumference Waist circumference measurement HealthDataType.waistCircumference Avg, Min, Max - HKQuantityTypeIdentifier.waistCircumference

โค๏ธ Vitals

Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Heart Rate Series Heart rate measurements over time HealthDataType.heartRateSeriesRecord Avg, Min, Max HeartRateRecord -
Heart Rate Measurement Single heart rate measurement HealthDataType.heartRateMeasurementRecord Avg, Min, Max - HKQuantityTypeIdentifier.heartRate
Resting Heart Rate Heart rate while at rest HealthDataType.restingHeartRate Avg, Min, Max RestingHeartRateRecord HKQuantityTypeIdentifier.restingHeartRate
Blood Pressure Systolic and diastolic blood pressure HealthDataType.bloodPressure Avg, Min, Max BloodPressureRecord HKCorrelationTypeIdentifier.bloodPressure
Systolic Blood Pressure Upper blood pressure value HealthDataType.systolicBloodPressure Avg, Min, Max - HKQuantityTypeIdentifier.bloodPressureSystolic
Diastolic Blood Pressure Lower blood pressure value HealthDataType.diastolicBloodPressure Avg, Min, Max - HKQuantityTypeIdentifier.bloodPressureDiastolic
Oxygen Saturation Blood oxygen saturation percentage HealthDataType.oxygenSaturation Avg, Min, Max OxygenSaturationRecord HKQuantityTypeIdentifier.oxygenSaturation
Respiratory Rate Breathing rate (breaths per minute) HealthDataType.respiratoryRate Avg, Min, Max RespiratoryRateRecord HKQuantityTypeIdentifier.respiratoryRate
VOโ‚‚ Max Maximum oxygen consumption HealthDataType.vo2Max Avg, Min, Max Vo2MaxRecord HKQuantityTypeIdentifier.vo2Max
Blood Glucose Blood glucose concentration HealthDataType.bloodGlucose Avg, Min, Max BloodGlucoseRecord HKQuantityTypeIdentifier.bloodGlucose
HRV RMSSD Heart Rate Variability (RMSSD) HealthDataType.heartRateVariabilityRmssd - HeartRateVariabilityRmssdRecord -
HRV SDNN Heart Rate Variability (SDNN) HealthDataType.heartRateVariabilitySdnn - - HKQuantityTypeIdentifier.heartRateVariabilitySDNN

๐Ÿ˜ด Sleep

Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Sleep Session Complete sleep session with sleep stages HealthDataType.sleepSession - SleepSessionRecord -
Sleep Stage Record Individual sleep stage measurement HealthDataType.sleepStageRecord - - HKCategoryTypeIdentifier.sleepAnalysis

๐Ÿ˜‹ Nutrition

Core & Hydration
Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Nutrition (composite) Complete nutrition record with macros and micronutrients HealthDataType.nutrition - NutritionRecord HKCorrelationType.food
Energy Total energy intake from food HealthDataType.energyNutrient (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.energy field) HKQuantityTypeIdentifier.dietaryEnergyConsumed
Hydration/Water Water and fluid intake HealthDataType.hydration Sum HydrationRecord HKQuantityTypeIdentifier.dietaryWater
Macronutrients
Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Protein Protein intake HealthDataType.protein (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.protein) HKQuantityTypeIdentifier.dietaryProtein
Total Carbohydrate Total carbs intake HealthDataType.totalCarbohydrate (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.carbs) HKQuantityType Identifier.dietaryCarbohydrates
Total Fat Total fat intake HealthDataType.totalFat (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.totalFat) HKQuantityTypeIdentifier.dietaryFatTotal
Caffeine Caffeine intake HealthDataType.caffeine (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.caffeine) HKQuantityTypeIdentifier.dietaryCaffeine
Fats
Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Saturated Fat Saturated fat intake HealthDataType.saturatedFat (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.saturatedFat) HKQuantityTypeIdentifier.dietaryFatSaturated
Monounsaturated Fat Monounsaturated fat intake HealthDataType.monounsaturatedFat (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.monounsaturatedFat) HKQuantityTypeIdentifier.dietaryFatMonounsaturated
Polyunsaturated Fat Polyunsaturated fat intake HealthDataType.polyunsaturatedFat (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.polyunsaturatedFat) HKQuantityTypeIdentifier.dietaryFatPolyunsaturated
Cholesterol Cholesterol intake HealthDataType.cholesterol (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.cholesterol) HKQuantityTypeIdentifier.dietaryCholesterol
Fiber & Sugar
Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Dietary Fiber Dietary fiber intake HealthDataType.dietaryFiber (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.dietaryFiber) HKQuantityTypeIdentifier.dietaryFiber
Sugar Sugar intake HealthDataType.sugar (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.sugar) HKQuantityTypeIdentifier.dietarySugar
Minerals
Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Calcium Calcium intake HealthDataType.calcium (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.calcium) HKQuantityTypeIdentifier.dietaryCalcium
Iron Iron intake HealthDataType.iron (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.iron) HKQuantityTypeIdentifier.dietaryIron
Magnesium Magnesium intake HealthDataType.magnesium (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.magnesium) HKQuantityTypeIdentifier.dietaryMagnesium
Manganese Manganese intake HealthDataType.manganese (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.manganese) HKQuantityTypeIdentifier.dietaryManganese
Phosphorus Phosphorus intake HealthDataType.phosphorus (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.phosphorus) HKQuantityTypeIdentifier.dietaryPhosphorus
Potassium Potassium intake HealthDataType.potassium (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.potassium) HKQuantityTypeIdentifier.dietaryPotassium
Selenium Selenium intake HealthDataType.selenium (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.selenium) HKQuantityTypeIdentifier.dietarySelenium
Sodium Sodium intake HealthDataType.sodium (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.sodium) HKQuantityTypeIdentifier.dietarySodium
Zinc Zinc intake HealthDataType.zinc (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.zinc) HKQuantityTypeIdentifier.dietaryZinc
B Vitamins
Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Thiamin (B1) Thiamin (vitamin B1) intake HealthDataType.thiamin (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.thiamin) HKQuantityTypeIdentifier.dietaryThiamin
Riboflavin (B2) Riboflavin (vitamin B2) HealthDataType.riboflavin (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.riboflavin) HKQuantityTypeIdentifier.dietaryRiboflavin
Niacin (B3) Niacin (vitamin B3) intake HealthDataType.niacin (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.niacin) HKQuantityTypeIdentifier.dietaryNiacin
Pantothenic Acid (B5) Pantothenic acid (vitamin B5) HealthDataType.pantothenicAcid (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.pantothenicAcid) HKQuantityTypeIdentifier.dietaryPantothenicAcid
Vitamin B6 Vitamin B6 intake HealthDataType.vitaminB6 (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.vitaminB6) HKQuantityTypeIdentifier.dietaryVitaminB6
Biotin (B7) Biotin (vitamin B7) intake HealthDataType.biotin (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.biotin) HKQuantityTypeIdentifier.dietaryBiotin
Folate (B9) Folate (vitamin B9) intake HealthDataType.folate (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.folate) HKQuantityTypeIdentifier.dietaryFolate
Vitamin B12 Vitamin B12 intake HealthDataType.vitaminB12 (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.vitaminB12) HKQuantityTypeIdentifier.dietaryVitaminB12
Other Vitamins
Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Vitamin A Vitamin A intake HealthDataType.vitaminA (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.vitaminA) HKQuantityTypeIdentifier.dietaryVitaminA
Vitamin C Vitamin C intake HealthDataType.vitaminC (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.vitaminC) HKQuantityTypeIdentifier.dietaryVitaminC
Vitamin D Vitamin D intake HealthDataType.vitaminD (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.vitaminD) HKQuantityTypeIdentifier.dietaryVitaminD
Vitamin E Vitamin E intake HealthDataType.vitaminE (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.vitaminE) HKQuantityTypeIdentifier.dietaryVitaminE
Vitamin K Vitamin K intake HealthDataType.vitaminK (iOS HealthKit Only) Sum NutritionRecord (NutritionRecord.vitaminK) HKQuantityTypeIdentifier.dietaryVitaminK

๐Ÿง˜ Wellness

Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Mindfulness Session Meditation and mindfulness sessions HealthDataType.mindfulnessSession Sum MindfulnessSessionRecord HKCategoryTypeIdentifier.mindfulSession

๐Ÿชท Cycle Tracking

Data Type Description Data Type Supported Aggregation Android Health Connect API iOS HealthKit API
Cervical Mucus Cervical mucus observations for fertility HealthDataType.cervicalMucus - CervicalMucusRecord HKCategoryTypeIdentifier.cervicalMucusQuality
Basal Body Temperature Basal body temperature HealthDataType.basalBodyTemperature Avg, Min, Max BasalBodyTemperatureRecord HKQuantityTypeIdentifier.basalBodyTemperature
Menstruation Flow Menstrual flow intensity HealthDataType.menstrualFlow - MenstruationFlowRecord HKCategoryTypeIdentifier.menstrualFlow
Ovulation Test Ovulation test result HealthDataType.ovulationTest - OvulationTestRecord HKCategoryTypeIdentifier.ovulationTestResult
Intermenstrual Bleeding Intermenstrual bleeding spotting HealthDataType.intermenstrualBleeding - - HKCategoryTypeIdentifier.persistentIntermenstrualBleeding

๐Ÿ“ค Back to top

๐Ÿ”„ Migration Guides #

๐Ÿค Contributing #

Contributions are welcome! See our GitHub Issues to report bugs or request features.

๐Ÿ“„ License #

This project is licensed under the Apache 2.0 License - see the LICENSE file for details.

6
likes
160
points
740
downloads

Publisher

unverified uploader

Weekly Downloads

The most comprehensive Flutter health plugin for seamless iOS HealthKit and Android Health Connect integration.

Homepage
Repository (GitHub)
View/report issues

Documentation

API reference

License

Apache-2.0 (license)

Dependencies

flutter, health_connector_core, health_connector_hc_android, health_connector_hk_ios, health_connector_logger, meta

More

Packages that depend on health_connector