spike_flutter_sdk 4.2.34
spike_flutter_sdk: ^4.2.34 copied to clipboard
Spike Health data reader for Android and iOS platforms.
example/main.dart
import 'package:flutter/material.dart';
import 'package:spike_flutter_sdk/spike_flutter_sdk.dart';
// Your API credentials
const authToken = '{YOUR_AUTH_TOKEN}';
const appId = '{YOUR_APP_ID}';
const customerEndUserId = '{YOUR_CUSTOMER_END_USER_ID}';
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?.customerEndUserId ?? 'Not integrated, yet'),
],
),
const Divider(),
const Text(
'Activity data',
style: TextStyle(
fontSize: 16.0,
fontWeight: FontWeight.bold,
),
),
const Divider(),
if (_lastData?.entries?.isEmpty == true)
const Text('No heart data read.'),
if (_lastData?.entries != null)
..._lastData!.entries!
.map((record) => _getHeartDataCard(record)),
const Divider(),
const Text(
'Last send data response',
style: TextStyle(
fontSize: 16.0,
fontWeight: FontWeight.bold,
),
),
const Divider(),
],
),
),
),
);
}
Widget _getHeartDataCard(SpikeHeartDataEntry 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 ?? 'Unset'),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Average HR',
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
Text(data.averageHeartRate.toString()),
],
),
],
),
);
}
Future<void> _createConnection() async {
_connection = await SpikeSDK.createConnection(
appId: appId,
authToken: authToken,
customerEndUserId: customerEndUserId,
);
await _connection!.ensurePermissionsAreGranted(
types: [SpikeDataType.heart],
);
setState(() {});
}
Future<void> _readData() async {
if (_connection == null) {
return;
}
final data = await _connection!.extractData(SpikeDataType.heart);
_lastData = data;
setState(() {});
}
}
copied to clipboard