> ## Documentation Index
> Fetch the complete documentation index at: https://docs.spikeapi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Flutter SDK Usage Guide

> Start getting Spike data in 3 steps using Spike SDK for Flutter platform.

## Step 1: Create a Spike Connection

To set up the Spike SDK create `SpikeConnectionV3` instance with your Spike application id, application user id and signature unique to
each of your application users (more on generating signatures [here](/api-docs/authentication)):

```dart theme={null}
import 'package:spike_flutter_sdk/spike_flutter_sdk.dart';

final spikeConnection = await SpikeSDKV3.createConnection(
    applicationId: 1000,
    signature: "signature",
    endUserId: "user-id",
);
```

## Step 2: Ask User for Permissions

If you plan to use Android Health Connect and/or Apple HealthKit data providers, you should first get users permission to use their data:

```dart theme={null}
// This call may present user with OS native modal asking for read 
// permissions needed to get steps and distance data. If you want to 
// present it only once, you should list all the statistic types you 
// plan to use. Otherwise, you can call this only before you actually 
// want to use the data.
await widget.connection.requestHealthPermissions(
    statisticTypes: [StatisticsType.steps],
    includeEnhancedPermissions: false,
);
```

<Warning>
  Please note that you need to call **requestHealthPermissions** each time users restart their app after making Spike Create Connection.
</Warning>

## Step 3: Get Data

<Note>
  The maximum permitted query date range on Android Health Connect is 90 days
</Note>

There are four types of data you can retrieve from Spike:

* **Statistics** are calculated values derived from records.
* **Activities** are data about a user's activities or workouts.
* **Sleep** is data about a user's sleep.
* **Records** consist of the raw data points collected from user devices or applications.

### Statistics

Now you can read hourly statistics data of steps and distance for today:

```dart theme={null}
final now = DateTime.now();
final tomorrow = DateTime(now.year, now.month, now.day + 1);
final weekAgo = now.subtract(const Duration(days: 7));

final statistics = await widget.connection.getStatistics(
    ofTypes: [StatisticsType.steps],
    from: weekAgo,
    to: tomorrow,
    interval: StatisticsInterval.day,
);
```

where:

```dart theme={null}
enum StatisticsType {
  steps,
  distanceTotal,
  distanceWalking,
  distanceCycling,
  distanceRunning,
  caloriesBurnedTotal,
  caloriesBurnedBasal,
  caloriesBurnedActive;
}

enum StatisticsInterval {
  hour,
  day;
}

// Filter
class StatisticsFilter {
  final bool excludeManual;
  final Set<Provider>? providers;
  final Set<ActivityTag>? activityTags;
}

// Result:

class Statistic {
  final DateTime start;
  final DateTime end;
  final int duration;
  final StatisticsType type;
  final num value;
  final Unit unit;
  final int? rowCount;
  final List<String>? recordIds;
}
```

### Records

```dart theme={null}
final now = DateTime.now();
final tomorrow = DateTime(now.year, now.month, now.day + 1);
final weekAgo = now.subtract(const Duration(days: 7));

final records = await connection.getRecords(
    ofTypes: [MetricType.stepsTotal],
    from: weekAgo,
    to: tomorrow,
    filter: StatisticsFilter(excludeManual: false),
);

```

where:

```dart theme={null}
enum MetricType {
  heartrateMax,
  heartrateAvg,
  heartrateMin,
  heartrate,
  heartrateResting,
  heartrateVariabilityRmssd,
  heartrateVariabilityRmssdDeepSleep,
  elevationMax,
  elevationAvg,
  elevationMin,
  elevationGain,
  elevationLoss,
  ascent,
  descent,
  caloriesBurnedActive,
  caloriesBurnedBasal,
  caloriesBurned,
  caloriesIntake,
  stepsTotal,
  floorsClimbed,
  distanceTotal,
  distanceWalking,
  distanceCycling,
  distanceRunning,
  distanceWheelchair,
  distanceSwimming,
  speedMax,
  speedAvg,
  speedMin,
  airTemperatureMax,
  airTemperatureAvg,
  airTemperatureMin,
  spo2Max,
  spo2Avg,
  spo2Min,
  longitude,
  latitude,
  elevation,
  durationActive,
  swimmingLengths,
  swimmingDistancePerStroke;
}


// Result: 

class Record {
  final String recordId;
  final String? inputMethod;
  final DateTime startAt;
  final DateTime? endAt;
  final DateTime modifiedAt;
  final int? duration;
  final String? provider;
  final String? providerSource;
  final bool? isSourceAggregated;
  final RecordSource? source;
  final Map<String, num>? metrics;
  final List<ActivityTag>? activityTags;
  final String? activityType;
  final List<ActivityEntry>? sessions;
  final List<ActivityEntry>? laps;
  final List<ActivityEntry>? segments;
  final List<ActivityEntry>? splits;
  final List<ActivityEntry>? samples;
  final List<ActivityEntry>? routePoints;
  final List<ActivityEntry>? sleep;
}

class ActivityEntry {
  final int? divisionRef;
  final String? divisionLabel;
  final DateTime? startAt;
  final DateTime? endAt;
  final int? duration;
  final Map<String, num>? metrics;
}
```
