Specialized Data Types
Menstruation Flow
Section titled “Menstruation Flow”Track menstrual cycle data using writeMenstruationFlow.
Method Signature
Section titled “Method Signature”Future<bool> writeMenstruationFlow({ required MenstruationFlow flow, required DateTime startTime, DateTime? endTime,})Flow Types
Section titled “Flow Types”enum MenstruationFlow { UNSPECIFIED, LIGHT, MEDIUM, HEAVY, SPOTTING,}Basic Usage
Section titled “Basic Usage”// Log menstruation flowawait health.writeMenstruationFlow( flow: MenstruationFlow.MEDIUM, startTime: DateTime.now(),);
// Different flow levelsawait health.writeMenstruationFlow( flow: MenstruationFlow.HEAVY, startTime: DateTime(2024, 1, 15, 8, 0),);
await health.writeMenstruationFlow( flow: MenstruationFlow.SPOTTING, startTime: DateTime(2024, 1, 20, 10, 30),);Cycle Tracking
Section titled “Cycle Tracking”class CycleTracker { final Health health;
CycleTracker(this.health);
Future<void> logDailyFlow(MenstruationFlow flow) async { await health.writeMenstruationFlow( flow: flow, startTime: DateTime.now(), ); }
Future<void> logPeriod({ required DateTime startDate, required int durationDays, required List<MenstruationFlow> dailyFlow, }) async { for (int i = 0; i < durationDays && i < dailyFlow.length; i++) { final date = startDate.add(Duration(days: i)); await health.writeMenstruationFlow( flow: dailyFlow[i], startTime: date, ); } }}
// Usagefinal tracker = CycleTracker(health);
// Log a 5-day periodawait tracker.logPeriod( startDate: DateTime(2024, 1, 15), durationDays: 5, dailyFlow: [ MenstruationFlow.LIGHT, MenstruationFlow.MEDIUM, MenstruationFlow.HEAVY, MenstruationFlow.MEDIUM, MenstruationFlow.LIGHT, ],);Audiogram
Section titled “Audiogram”Write hearing test results using writeAudiogram.
Method Signature
Section titled “Method Signature”Future<bool> writeAudiogram({ required List<double> frequencies, required List<double> leftEarSensitivities, required List<double> rightEarSensitivities, required DateTime startTime, DateTime? endTime,})Parameters
Section titled “Parameters”| Parameter | Type | Description |
|---|---|---|
frequencies |
List<double> |
Test frequencies in Hz |
leftEarSensitivities |
List<double> |
Left ear hearing levels in dB |
rightEarSensitivities |
List<double> |
Right ear hearing levels in dB |
startTime |
DateTime |
Test timestamp |
Basic Usage
Section titled “Basic Usage”// Standard audiogram frequenciesawait health.writeAudiogram( frequencies: [125, 250, 500, 1000, 2000, 4000, 8000], leftEarSensitivities: [20, 20, 15, 15, 20, 25, 30], rightEarSensitivities: [20, 15, 15, 20, 20, 20, 25], startTime: DateTime.now(),);Extended Frequency Range
Section titled “Extended Frequency Range”// Extended audiogram with more frequenciesawait health.writeAudiogram( frequencies: [ 125, 250, 500, 750, 1000, 1500, 2000, 3000, 4000, 6000, 8000 ], leftEarSensitivities: [ 25, 20, 15, 15, 15, 20, 20, 25, 30, 35, 40 ], rightEarSensitivities: [ 20, 20, 15, 15, 15, 15, 20, 20, 25, 30, 35 ], startTime: DateTime.now(),);Hearing Loss Classification
Section titled “Hearing Loss Classification”String classifyHearingLoss(double averageThreshold) { if (averageThreshold <= 25) { return 'Normal'; } else if (averageThreshold <= 40) { return 'Mild hearing loss'; } else if (averageThreshold <= 55) { return 'Moderate hearing loss'; } else if (averageThreshold <= 70) { return 'Moderately severe hearing loss'; } else if (averageThreshold <= 90) { return 'Severe hearing loss'; } else { return 'Profound hearing loss'; }}
class AudiogramAnalyzer { static double calculatePTA(List<double> sensitivities) { // Pure Tone Average: average of 500, 1000, 2000 Hz if (sensitivities.length < 3) return 0; return (sensitivities[0] + sensitivities[1] + sensitivities[2]) / 3; }
static Future<void> saveAndAnalyze( Health health, List<double> frequencies, List<double> leftEar, List<double> rightEar, ) async { // Save audiogram await health.writeAudiogram( frequencies: frequencies, leftEarSensitivities: leftEar, rightEarSensitivities: rightEar, startTime: DateTime.now(), );
// Analyze results final leftPTA = calculatePTA(leftEar); final rightPTA = calculatePTA(rightEar);
print('Left ear PTA: ${leftPTA.toStringAsFixed(1)} dB'); print('Classification: ${classifyHearingLoss(leftPTA)}'); print('Right ear PTA: ${rightPTA.toStringAsFixed(1)} dB'); print('Classification: ${classifyHearingLoss(rightPTA)}'); }}Insulin Delivery
Section titled “Insulin Delivery”Track insulin doses using writeInsulinDelivery.
Method Signature
Section titled “Method Signature”Future<bool> writeInsulinDelivery({ required double units, required DateTime startTime, DateTime? endTime,})Parameters
Section titled “Parameters”| Parameter | Type | Description |
|---|---|---|
units |
double |
Insulin units delivered |
startTime |
DateTime |
When insulin was administered |
endTime |
DateTime? |
End time (optional) |
Basic Usage
Section titled “Basic Usage”// Bolus insulin doseawait health.writeInsulinDelivery( units: 5.0, startTime: DateTime.now(),);
// Basal insulin doseawait health.writeInsulinDelivery( units: 12.0, startTime: DateTime.now(),);Insulin Tracking
Section titled “Insulin Tracking”enum InsulinType { rapid, short, intermediate, long,}
class InsulinLogger { final Health health;
InsulinLogger(this.health);
Future<bool> logDose({ required double units, required InsulinType type, DateTime? administeredAt, }) async { final success = await health.writeInsulinDelivery( units: units, startTime: administeredAt ?? DateTime.now(), );
if (success) { print('Logged $units units of ${type.name} insulin'); }
return success; }
Future<void> logBasalBolusTherapy({ required double basalUnits, required double bolusUnits, }) async { final now = DateTime.now();
// Log long-acting basal await logDose( units: basalUnits, type: InsulinType.long, administeredAt: now, );
// Log rapid-acting bolus await logDose( units: bolusUnits, type: InsulinType.rapid, administeredAt: now, ); }}
// Usagefinal logger = InsulinLogger(health);
// Meal-time bolusawait logger.logDose( units: 4.0, type: InsulinType.rapid,);
// Basal-bolus therapyawait logger.logBasalBolusTherapy( basalUnits: 10.0, bolusUnits: 5.0,);Carb-to-Insulin Ratio
Section titled “Carb-to-Insulin Ratio”class InsulinCalculator { final double carbRatio; // grams of carbs per unit final double correctionFactor; // mg/dL per unit final double targetGlucose; // mg/dL
InsulinCalculator({ required this.carbRatio, required this.correctionFactor, required this.targetGlucose, });
double calculateBolusUnits({ required double carbsGrams, required double currentGlucose, }) { // Carb coverage final carbUnits = carbsGrams / carbRatio;
// Correction dose final glucoseAboveTarget = currentGlucose - targetGlucose; final correctionUnits = glucoseAboveTarget / correctionFactor;
// Total bolus (minimum 0) return (carbUnits + correctionUnits).clamp(0, double.infinity); }
Future<void> logMealBolus({ required Health health, required double carbsGrams, required double currentGlucose, }) async { final units = calculateBolusUnits( carbsGrams: carbsGrams, currentGlucose: currentGlucose, );
print('Calculated $units units for $carbsGrams g carbs');
await health.writeInsulinDelivery( units: units, startTime: DateTime.now(), ); }}
// Usagefinal calculator = InsulinCalculator( carbRatio: 10.0, // 1 unit per 10g carbs correctionFactor: 50.0, // 1 unit lowers glucose by 50 mg/dL targetGlucose: 100.0, // Target 100 mg/dL);
await calculator.logMealBolus( health: health, carbsGrams: 60.0, // 60g carbs currentGlucose: 150.0, // Current blood glucose);Permission Requirements
Section titled “Permission Requirements”// Request permissions for specialized typesfinal types = [ HealthDataType.MENSTRUATION_FLOW, HealthDataType.AUDIOGRAM, HealthDataType.INSULIN_DELIVERY,];
final granted = await health.requestAuthorization( types, permissions: List.filled(types.length, HealthDataAccess.WRITE),);Platform Differences
Section titled “Platform Differences”- Full support for all specialized types
- Menstruation data integrates with Cycle Tracking
- Audiograms appear in Health app
- Insulin tracking available
- Specialized type support varies
- Menstruation tracking supported
- Audiogram and insulin support may be limited
- Check Health Connect compatibility
See Also
Section titled “See Also”- Basic Writing - General health data
- Data Types - All available types
- Basic Reading - Reading specialized data