HealthDataPoint

The primary model representing a single health data point.

Properties

class HealthDataPoint {
  final String uuid;
  final double value;
  final HealthDataType type;
  final HealthDataUnit unit;
  final DateTime dateFrom;
  final DateTime dateTo;
  final String sourcePlatform;
  final String sourceId;
  final String sourceName;
  final RecordingMethod recordingMethod;
  final HealthValue healthValue;
}
PropertyTypeDescription
uuidStringUnique identifier (iOS)
valuedoubleNumeric value (deprecated, use healthValue)
typeHealthDataTypeType of health data
unitHealthDataUnitUnit of measurement
dateFromDateTimeStart time/measurement time
dateToDateTimeEnd time
sourcePlatformStringPlatform (iOS/Android)
sourceIdStringSource application ID
sourceNameStringSource application name
recordingMethodRecordingMethodHow data was recorded
healthValueHealthValuePolymorphic value object

Example Usage

final dataPoints = await health.getHealthDataFromTypes(
  types: [HealthDataType.STEPS],
  startDate: DateTime.now().subtract(Duration(days: 1)),
  endDate: DateTime.now(),
);

for (var point in dataPoints) {
  print('Type: ${point.type}');
  print('Value: ${point.value}');
  print('Unit: ${point.unit}');
  print('From: ${point.dateFrom}');
  print('To: ${point.dateTo}');
  print('Source: ${point.sourceName}');
}

HealthValue Types

The healthValue property contains type-specific data.

NumericHealthValue

For numeric measurements (steps, weight, heart rate, etc.)
class NumericHealthValue extends HealthValue {
  final double numericValue;
}
Example:
final point = dataPoints.first;
if (point.value is NumericHealthValue) {
  final numeric = point.value as NumericHealthValue;
  print('Value: ${numeric.numericValue}');
}
Used by: STEPS, WEIGHT, HEIGHT, HEART_RATE, BLOOD_GLUCOSE, BODY_TEMPERATURE, etc.

WorkoutHealthValue

For workout/exercise data.
class WorkoutHealthValue extends HealthValue {
  final HealthWorkoutActivityType workoutActivityType;
  final double? totalEnergyBurned;
  final HealthDataUnit? totalEnergyBurnedUnit;
  final double? totalDistance;
  final HealthDataUnit? totalDistanceUnit;
}
Example:
if (point.value is WorkoutHealthValue) {
  final workout = point.value as WorkoutHealthValue;
  print('Activity: ${workout.workoutActivityType.name}');
  print('Calories: ${workout.totalEnergyBurned ?? 0}');
  print('Distance: ${workout.totalDistance ?? 0}');
}
Used by: WORKOUT

AudiogramHealthValue

For hearing test results.
class AudiogramHealthValue extends HealthValue {
  final List<double> frequencies;
  final List<double> leftEarSensitivities;
  final List<double> rightEarSensitivities;
}
Example:
if (point.value is AudiogramHealthValue) {
  final audiogram = point.value as AudiogramHealthValue;
  print('Frequencies: ${audiogram.frequencies}');
  print('Left ear: ${audiogram.leftEarSensitivities}');
  print('Right ear: ${audiogram.rightEarSensitivities}');
}
Used by: AUDIOGRAM

ElectrocardiogramHealthValue

For ECG/EKG data.
class ElectrocardiogramHealthValue extends HealthValue {
  final List<ElectrocardiogramVoltageValue> voltageValues;
  final double averageHeartRate;
  final ElectrocardiogramClassification classification;
  final double samplingFrequency;
}
Example:
if (point.value is ElectrocardiogramHealthValue) {
  final ecg = point.value as ElectrocardiogramHealthValue;
  print('Heart rate: ${ecg.averageHeartRate} bpm');
  print('Classification: ${ecg.classification}');
  print('Samples: ${ecg.voltageValues.length}');
}
Used by: ELECTROCARDIOGRAM

NutritionHealthValue

For meal/nutrition data.
class NutritionHealthValue extends HealthValue {
  final String? name;
  final double? calories;
  final double? protein;
  final double? carbs;
  final double? fat;
  final double? fiber;
  final double? sugar;
  final double? caffeine;
  final double? vitaminA;
  final double? vitaminC;
  // ... many more micronutrients
  final MealType? mealType;
}
Example:
if (point.value is NutritionHealthValue) {
  final nutrition = point.value as NutritionHealthValue;
  print('Meal: ${nutrition.name}');
  print('Type: ${nutrition.mealType}');
  print('Calories: ${nutrition.calories ?? 0}');
  print('Protein: ${nutrition.protein ?? 0}g');
  print('Carbs: ${nutrition.carbs ?? 0}g');
  print('Fat: ${nutrition.fat ?? 0}g');
}
Used by: NUTRITION

InsulinDeliveryHealthValue

For insulin dose data.
class InsulinDeliveryHealthValue extends HealthValue {
  final double units;
}
Example:
if (point.value is InsulinDeliveryHealthValue) {
  final insulin = point.value as InsulinDeliveryHealthValue;
  print('Insulin: ${insulin.units} units');
}
Used by: INSULIN_DELIVERY

MenstruationFlowHealthValue

For menstrual cycle data.
class MenstruationFlowHealthValue extends HealthValue {
  final MenstruationFlow flow;
  final bool isStartOfCycle;
}
Example:
if (point.value is MenstruationFlowHealthValue) {
  final menstruation = point.value as MenstruationFlowHealthValue;
  print('Flow: ${menstruation.flow.name}');
  print('Start of cycle: ${menstruation.isStartOfCycle}');
}
Used by: MENSTRUATION_FLOW

WorkoutSummary

Aggregated workout information (deprecated in favor of WorkoutHealthValue).
class WorkoutSummary {
  final HealthWorkoutActivityType workoutType;
  final DateTime startTime;
  final DateTime endTime;
  final double? totalDistance;
  final HealthDataUnit? totalDistanceUnit;
  final double? totalEnergyBurned;
  final HealthDataUnit? totalEnergyBurnedUnit;
}

Type Checking Pattern

void processHealthValue(HealthDataPoint point) {
  final value = point.healthValue;
  
  if (value is NumericHealthValue) {
    print('Numeric: ${value.numericValue}');
  } else if (value is WorkoutHealthValue) {
    print('Workout: ${value.workoutActivityType.name}');
  } else if (value is NutritionHealthValue) {
    print('Meal: ${value.name}');
  } else if (value is AudiogramHealthValue) {
    print('Audiogram: ${value.frequencies.length} frequencies');
  } else if (value is ElectrocardiogramHealthValue) {
    print('ECG: ${value.averageHeartRate} bpm');
  } else if (value is InsulinDeliveryHealthValue) {
    print('Insulin: ${value.units} units');
  } else if (value is MenstruationFlowHealthValue) {
    print('Flow: ${value.flow.name}');
  }
}

Value Type Summary

Value TypeUsed ForKey Properties
NumericHealthValueMost metricsnumericValue
WorkoutHealthValueWorkoutsworkoutActivityType, totalEnergyBurned, totalDistance
AudiogramHealthValueHearing testsfrequencies, leftEarSensitivities, rightEarSensitivities
ElectrocardiogramHealthValueECG datavoltageValues, averageHeartRate, classification
NutritionHealthValueMealscalories, protein, carbs, fat, mealType
InsulinDeliveryHealthValueInsulinunits
MenstruationFlowHealthValueMenstruationflow, isStartOfCycle

Data Processing Helpers

Extracting Numeric Values

List<double> extractNumericValues(List<HealthDataPoint> points) {
  return points
      .where((p) => p.healthValue is NumericHealthValue)
      .map((p) => (p.healthValue as NumericHealthValue).numericValue)
      .toList();
}

Grouping by Type

Map<HealthDataType, List<HealthDataPoint>> groupByType(
  List<HealthDataPoint> points,
) {
  final grouped = <HealthDataType, List<HealthDataPoint>>{};
  
  for (var point in points) {
    grouped.putIfAbsent(point.type, () => []).add(point);
  }
  
  return grouped;
}

Filtering by Source

List<HealthDataPoint> filterBySource(
  List<HealthDataPoint> points,
  String sourceName,
) {
  return points.where((p) => p.sourceName == sourceName).toList();
}

Filtering by Recording Method

List<HealthDataPoint> filterByRecordingMethod(
  List<HealthDataPoint> points,
  RecordingMethod method,
) {
  return points.where((p) => p.recordingMethod == method).toList();
}

See Also