Skip to content
CARP Docs
Ask AISystemLightDark
On this page

Nutrition

Write meals with macronutrients, micronutrients, caffeine and water using writeMeal.

Copy MarkdownOpen inOpen in GitHubView as MarkdownOpen in Scira AIOpen in ChatGPTOpen in ClaudeOpen in Cursor

writeMeal writes a meal as a NUTRITION record with its meal type, name and nutrient values. Pass only the nutrients you have.

Signature

Future<bool> writeMeal({
  required DateTime startTime,
  DateTime? endTime,
  DateTime? recordingTime,
  MealType? mealType,
  double? calories,
  double? protein,
  double? carbs,
  double? fat,
  double? caffeine,
  String? name,
  // ... many more micronutrient parameters
})

Core parameters

ParameterTypeDescription
startTimeDateTimeWhen the meal was consumed
endTimeDateTime?End time (optional)
mealTypeMealType?Breakfast, lunch, dinner, snack
nameString?Meal name or description

Macronutrients

ParameterTypeUnitDescription
caloriesdouble?kcalTotal energy
proteindouble?gramsProtein content
carbsdouble?gramsCarbohydrates
fatdouble?gramsTotal fat
fiberdouble?gramsDietary fiber
sugardouble?gramsSugars

Write a meal

// Simple meal with macros
await health.writeMeal(
  startTime: DateTime.now(),
  mealType: MealType.BREAKFAST,
  name: 'Oatmeal with berries',
  calories: 350.0,
  protein: 12.0,
  carbs: 58.0,
  fat: 8.0,
);

// Lunch with detailed macros
await health.writeMeal(
  startTime: DateTime.now(),
  mealType: MealType.LUNCH,
  name: 'Grilled chicken salad',
  calories: 450.0,
  protein: 35.0,
  carbs: 25.0,
  fat: 20.0,
  fiber: 8.0,
  sugar: 5.0,
);

Meal types

enum MealType {
  BREAKFAST,
  LUNCH,
  DINNER,
  SNACK,
  UNKNOWN,
}

// Usage
await health.writeMeal(
  startTime: DateTime.now(),
  mealType: MealType.SNACK,
  name: 'Apple with peanut butter',
  calories: 180.0,
);

Micronutrients

writeMeal supports many micronutrients:

await health.writeMeal(
  startTime: DateTime.now(),
  name: 'Fortified cereal',
  calories: 250.0,
  
  // Vitamins
  vitaminA: 500.0,      // mcg
  vitaminC: 60.0,       // mg
  vitaminD: 10.0,       // mcg
  vitaminE: 15.0,       // mg
  vitaminK: 80.0,       // mcg
  vitaminB1: 1.2,       // mg (Thiamin)
  vitaminB2: 1.3,       // mg (Riboflavin)
  vitaminB3: 16.0,      // mg (Niacin)
  vitaminB6: 1.4,       // mg
  vitaminB12: 2.4,      // mcg
  folate: 400.0,        // mcg
  
  // Minerals
  calcium: 300.0,       // mg
  iron: 8.0,            // mg
  magnesium: 100.0,     // mg
  phosphorus: 250.0,    // mg
  potassium: 400.0,     // mg
  sodium: 200.0,        // mg
  zinc: 11.0,           // mg
);

For the full parameter list, see writeMeal in the API reference.

Caffeine, water and fat breakdown

// Caffeine tracking
await health.writeMeal(
  startTime: DateTime.now(),
  name: 'Coffee',
  mealType: MealType.BREAKFAST,
  calories: 5.0,
  caffeine: 95.0, // mg
);

// Water tracking
await health.writeMeal(
  startTime: DateTime.now(),
  name: 'Water',
  water: 500.0, // ml
);

// Fat breakdown
await health.writeMeal(
  startTime: DateTime.now(),
  name: 'Avocado toast',
  calories: 320.0,
  fat: 18.0,
  fatSaturated: 2.5,        // Saturated fat (g)
  fatMonounsaturated: 12.0,  // Monounsaturated fat (g)
  fatPolyunsaturated: 2.0,   // Polyunsaturated fat (g)
  cholesterol: 0.0,          // mg
);

Examples

Meal logger

class MealLogger {
  final Health health;
  
  MealLogger(this.health);
  
  Future<bool> logMeal({
    required String name,
    required MealType type,
    DateTime? consumedAt,
    double? calories,
    double? protein,
    double? carbs,
    double? fat,
    double? fiber,
    double? sugar,
  }) async {
    return await health.writeMeal(
      startTime: consumedAt ?? DateTime.now(),
      mealType: type,
      name: name,
      calories: calories,
      protein: protein,
      carbs: carbs,
      fat: fat,
      fiber: fiber,
      sugar: sugar,
    );
  }
  
  Future<void> logDailyMeals() async {
    final today = DateTime.now();
    
    // Breakfast
    await logMeal(
      name: 'Scrambled eggs with toast',
      type: MealType.BREAKFAST,
      consumedAt: DateTime(today.year, today.month, today.day, 8, 0),
      calories: 400,
      protein: 24,
      carbs: 35,
      fat: 18,
    );
    
    // Lunch
    await logMeal(
      name: 'Chicken wrap',
      type: MealType.LUNCH,
      consumedAt: DateTime(today.year, today.month, today.day, 12, 30),
      calories: 500,
      protein: 32,
      carbs: 48,
      fat: 18,
    );
    
    // Dinner
    await logMeal(
      name: 'Salmon with vegetables',
      type: MealType.DINNER,
      consumedAt: DateTime(today.year, today.month, today.day, 19, 0),
      calories: 550,
      protein: 38,
      carbs: 42,
      fat: 22,
    );
  }
}

Log servings of a recipe

class Recipe {
  final String name;
  final double servings;
  final Map<String, double> nutrition;
  
  Recipe({
    required this.name,
    required this.servings,
    required this.nutrition,
  });
  
  Future<bool> logServing(Health health, double servingSize) async {
    final multiplier = servingSize / servings;
    
    return await health.writeMeal(
      startTime: DateTime.now(),
      name: name,
      calories: (nutrition['calories'] ?? 0) * multiplier,
      protein: (nutrition['protein'] ?? 0) * multiplier,
      carbs: (nutrition['carbs'] ?? 0) * multiplier,
      fat: (nutrition['fat'] ?? 0) * multiplier,
    );
  }
}

// Usage
final grilledChicken = Recipe(
  name: 'Grilled Chicken Breast',
  servings: 4.0,
  nutrition: {
    'calories': 660.0,
    'protein': 120.0,
    'carbs': 0.0,
    'fat': 18.0,
  },
);

await grilledChicken.logServing(health, 1.0); // Log 1 serving

Calculate macros

class MacroCalculator {
  // Standard calorie values per gram
  static const double caloriesPerGramProtein = 4.0;
  static const double caloriesPerGramCarbs = 4.0;
  static const double caloriesPerGramFat = 9.0;
  
  static double calculateTotalCalories({
    double? protein,
    double? carbs,
    double? fat,
  }) {
    return (protein ?? 0) * caloriesPerGramProtein +
           (carbs ?? 0) * caloriesPerGramCarbs +
           (fat ?? 0) * caloriesPerGramFat;
  }
  
  static Map<String, double> calculateMacroPercentages({
    required double protein,
    required double carbs,
    required double fat,
  }) {
    final totalCalories = calculateTotalCalories(
      protein: protein,
      carbs: carbs,
      fat: fat,
    );
    
    if (totalCalories == 0) {
      return {'protein': 0, 'carbs': 0, 'fat': 0};
    }
    
    return {
      'protein': (protein * caloriesPerGramProtein / totalCalories * 100),
      'carbs': (carbs * caloriesPerGramCarbs / totalCalories * 100),
      'fat': (fat * caloriesPerGramFat / totalCalories * 100),
    };
  }
}

// Usage
final macros = MacroCalculator.calculateMacroPercentages(
  protein: 30,
  carbs: 40,
  fat: 15,
);

print('Protein: ${macros['protein']?.toStringAsFixed(1)}%');
print('Carbs: ${macros['carbs']?.toStringAsFixed(1)}%');
print('Fat: ${macros['fat']?.toStringAsFixed(1)}%');

Default meal times

class MealTiming {
  static DateTime breakfast([DateTime? date]) {
    final d = date ?? DateTime.now();
    return DateTime(d.year, d.month, d.day, 8, 0);
  }
  
  static DateTime morningSnack([DateTime? date]) {
    final d = date ?? DateTime.now();
    return DateTime(d.year, d.month, d.day, 10, 30);
  }
  
  static DateTime lunch([DateTime? date]) {
    final d = date ?? DateTime.now();
    return DateTime(d.year, d.month, d.day, 12, 30);
  }
  
  static DateTime afternoonSnack([DateTime? date]) {
    final d = date ?? DateTime.now();
    return DateTime(d.year, d.month, d.day, 15, 30);
  }
  
  static DateTime dinner([DateTime? date]) {
    final d = date ?? DateTime.now();
    return DateTime(d.year, d.month, d.day, 19, 0);
  }
}

// Usage
await health.writeMeal(
  startTime: MealTiming.breakfast(),
  mealType: MealType.BREAKFAST,
  name: 'Morning oatmeal',
  calories: 350,
);

Platform differences

AndroidiOS
  • Meals are stored as nutrition records in Health Connect.
  • Micronutrient support may vary.
  • Requires the Health Connect SDK.
  • Compatible with nutrition tracking apps.
  • Meals are stored as a complete nutrition record.
  • All micronutrients are supported.
  • Data appears in the Apple Health app.
  • Can link with Apple's Nutrition app.

Quick links

Page · DocumentationCARP DocumentationPage · DocumentationIntroductionPage · DocumentationQuickstartPage · DocumentationTerminologyPage · DocumentationArchitecture