spike_flutter_sdk 1.0.8
spike_flutter_sdk: ^1.0.8 copied to clipboard
Reads HealthKit data from iOS HealthKit, and syncs it with Spike backend.
example/main.dart
import 'package:flutter/material.dart';
import 'package:spike_flutter_sdk/connection/spike_connection.dart';
import 'package:spike_flutter_sdk/model/atoms/spike_data_type.dart';
import 'package:spike_flutter_sdk/model/organisms/spike_heart_response_record.dart';
import 'package:spike_flutter_sdk/model/templates/spike_heart_data.dart';
import 'package:spike_flutter_sdk/spike_sdk.dart';
// Your API credentials
const authToken = 'fa0b3803-6068-4ea7-9788-eccce210d30c';
const appId = 'ea9e03f5-be45-49fb-bf4c-47a88c184c3b';
const customerEndUserId = 'jasbdhasbfashfj';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
SpikeConnection? _connection;
SpikeHeartData? _lastData;
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Health Kit Api'),
),
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'Actions',
style: TextStyle(
fontSize: 16.0,
fontWeight: FontWeight.bold,
),
),
const Divider(),
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: IntrinsicHeight(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextButton(
onPressed: _createConnection,
child: const Text('Create connection'),
),
const VerticalDivider(),
TextButton(
onPressed: _readData,
child: const Text('Read data'),
),
],
),
),
),
const Divider(),
const Text(
'Authorization data',
style: TextStyle(
fontSize: 16.0,
fontWeight: FontWeight.bold,
),
),
const Divider(),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Authorized',
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
Text(_connection != null ? 'Yes' : 'No'),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Integration user ID',
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
Text(_connection?.getSpikeEndUserId() ??
'Not integrated, yet'),
],
),
const Divider(),
const Text(
'Activity data',
style: TextStyle(
fontSize: 16.0,
fontWeight: FontWeight.bold,
),
),
const Divider(),
if (_lastData?.data.isEmpty == true)
const Text('No heart data read.'),
if (_lastData?.data != null)
..._lastData!.data.map((record) => _getHeartDataCard(record)),
const Divider(),
const Text(
'Last send data response',
style: TextStyle(
fontSize: 16.0,
fontWeight: FontWeight.bold,
),
),
const Divider(),
],
),
),
),
);
}
Widget _getHeartDataCard(SpikeHeartResponseRecord data) {
return Container(
color: Colors.amber,
margin: const EdgeInsets.all(4.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Date',
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
Text(data.date?.toIso8601String() ?? 'Unset'),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Average HR',
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
Text(data.avgHeartRate.toString()),
],
),
],
),
);
}
Future<void> _createConnection() async {
await SpikeSDK.ensurePermissionsAreGranted([SpikeDataType.heart]);
_connection = await SpikeSDK.createConnection(
host: 'https://dev.api.spikeapi.com',
appId: appId,
authToken: authToken,
customerEndUserId: customerEndUserId,
);
setState(() {});
}
Future<void> _readData() async {
if (_connection == null) {
return;
}
_lastData =
await _connection!.extractData(SpikeDataType.heart) as SpikeHeartData;
setState(() {});
}
}