Integrating with Health and Fitness APIs in Flutter

Flutter’s versatility extends beyond just typical app development. It’s also capable of integrating with various health and fitness APIs, enabling developers to create apps that track workouts, monitor health metrics, and offer personalized fitness recommendations. Integrating with these APIs allows you to leverage data from wearables, fitness trackers, and other health platforms, providing users with a comprehensive view of their health and fitness activities.

Why Integrate Health and Fitness APIs in Flutter?

  • Comprehensive User Data: Gather data from various sources, including wearables and fitness apps.
  • Personalized Experiences: Provide tailored fitness plans, insights, and recommendations.
  • Enhanced App Functionality: Add features such as workout tracking, nutrition logging, and sleep monitoring.
  • Market Opportunity: Tap into the growing market of health and fitness apps.

Available Health and Fitness APIs

Several APIs are available for integrating health and fitness data:

  • Google Fit API: A platform for tracking fitness activities and health data on Android devices.
  • Apple HealthKit: An iOS framework that provides a central repository for health and fitness data.
  • Samsung Health SDK: Offers APIs for accessing and managing health data on Samsung devices.
  • Third-Party APIs: Other APIs like Fitbit, Strava, and Garmin Connect offer access to user data with proper authorization.

Setting up Your Flutter Project

Before integrating any Health and Fitness API, set up your Flutter project:

Step 1: Create a New Flutter Project

flutter create health_fitness_app
cd health_fitness_app

Step 2: Add Necessary Dependencies

Include dependencies in your pubspec.yaml file:

dependencies:
  flutter:
    sdk: flutter
  # Add dependencies for specific APIs here, e.g.,
  # google_fit: ^latest_version
  # health: ^latest_version

Step 3: Install Dependencies

flutter pub get

Integrating with Google Fit API

The Google Fit API allows you to read and write fitness data on Android devices. To integrate with Google Fit, use the google_fit Flutter package.

Step 1: Add Google Fit Dependency

Add the google_fit package to your pubspec.yaml:

dependencies:
  flutter:
    sdk: flutter
  google_fit: ^0.9.0 # Use the latest version

Step 2: Configure AndroidManifest.xml

Add necessary permissions in android/app/src/main/AndroidManifest.xml:


    
    
    
    
        
            
            
                
                
            
        
        
    

Step 3: Implement Google Fit Integration

Here’s how to check Google Fit availability, authenticate, and read step count data:

import 'package:flutter/material.dart';
import 'package:google_fit/google_fit.dart';

class GoogleFitIntegration extends StatefulWidget {
  @override
  _GoogleFitIntegrationState createState() => _GoogleFitIntegrationState();
}

class _GoogleFitIntegrationState extends State {
  bool _isAvailable = false;
  bool _isAuthorized = false;
  int _stepCount = 0;

  @override
  void initState() {
    super.initState();
    initGoogleFit();
  }

  Future initGoogleFit() async {
    try {
      _isAvailable = await GoogleFit.isAvailable();
      if (_isAvailable) {
        final permissions = [
          DataType.DT_STEP_COUNT_DELTA,
          DataType.DT_ACTIVITY_SEGMENT,
          DataType.DT_DISTANCE_DELTA,
          DataType.DT_CALORIES_EXPENDED
        ];
        _isAuthorized = await GoogleFit.authorize(permissions);
      }

      if (_isAuthorized) {
        await readStepCount();
      }
    } catch (e) {
      print("Error: $e");
    }
    setState(() {});
  }

  Future readStepCount() async {
    final now = DateTime.now();
    final midnight = DateTime(now.year, now.month, now.day);
    try {
      final result = await GoogleFit.readStepCount(midnight, now);
      setState(() {
        _stepCount = result;
      });
    } catch (e) {
      print("Error reading step count: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Fit Integration'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Google Fit Available: $_isAvailable'),
            Text('Authorized: $_isAuthorized'),
            Text('Step Count: $_stepCount'),
            ElevatedButton(
              onPressed: _isAvailable ? initGoogleFit : null,
              child: Text(_isAuthorized ? 'Refresh Step Count' : 'Authorize'),
            ),
          ],
        ),
      ),
    );
  }
}

This code:

  • Initializes Google Fit, checks for availability, and requests authorization.
  • Reads the step count from Google Fit for the current day.
  • Displays the Google Fit availability, authorization status, and step count in the UI.

Integrating with Apple HealthKit

HealthKit provides a central repository for health and fitness data on iOS devices. The health package facilitates HealthKit integration.

Step 1: Add Health Dependency

Add the health package to your pubspec.yaml:

dependencies:
  flutter:
    sdk: flutter
  health: ^2.2.1 # Use the latest version

Step 2: Configure Info.plist

Add usage descriptions in ios/Runner/Info.plist:


    
    NSHealthUpdateUsageDescription
    This app requires write access to health data to save your workouts.
    NSHealthShareUsageDescription
    This app requires read access to health data to provide fitness insights.

Step 3: Implement HealthKit Integration

Implement HealthKit initialization, permission requests, and data reading:

import 'package:flutter/material.dart';
import 'package:health/health.dart';

class HealthKitIntegration extends StatefulWidget {
  @override
  _HealthKitIntegrationState createState() => _HealthKitIntegrationState();
}

class _HealthKitIntegrationState extends State {
  HealthFactory health = HealthFactory();
  List _healthData = [];

  @override
  void initState() {
    super.initState();
    fetchHealthData();
  }

  Future fetchHealthData() async {
    // Define the types to read
    List types = [
      HealthDataType.STEPS,
      HealthDataType.ACTIVE_ENERGY_BURNED,
      HealthDataType.HEIGHT,
      HealthDataType.WEIGHT,
    ];

    // Request permissions
    bool authorized = await health.requestAuthorization(types);

    if (authorized) {
      DateTime startDate = DateTime.now().subtract(Duration(days: 7));
      DateTime endDate = DateTime.now();

      // Fetch health data
      try {
        List healthData = await health.getHealthDataFromTypes(startDate, endDate, types);
        setState(() {
          _healthData = healthData;
        });
      } catch (e) {
        print("Error fetching health data: $e");
      }
    } else {
      print("Authorization not granted");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('HealthKit Integration'),
      ),
      body: ListView.builder(
        itemCount: _healthData.length,
        itemBuilder: (context, index) {
          HealthDataPoint dataPoint = _healthData[index];
          return ListTile(
            title: Text('${dataPoint.typeString}: ${dataPoint.value} ${dataPoint.unitString}'),
            subtitle: Text('Date: ${dataPoint.dateFrom} - ${dataPoint.dateTo}'),
          );
        },
      ),
    );
  }
}

This code:

  • Initializes HealthFactory and defines the health data types to be read.
  • Requests authorization from the user to access the specified health data types.
  • Fetches health data points from HealthKit for the last 7 days.
  • Displays the fetched health data in a list view.

Conclusion

Integrating with Health and Fitness APIs in Flutter allows you to create powerful, data-driven apps. Whether it’s reading step counts from Google Fit or accessing health data from HealthKit, Flutter provides the flexibility and tools needed to build comprehensive health and fitness solutions. By following the outlined steps, developers can create apps that provide users with personalized fitness insights, enhancing their overall app experience.