import 'dart:async';
import 'package:flutter/material.dart';
import 'package:synheart_wear/synheart_wear.dart';
class HealthMonitor extends StatefulWidget {
@override
_HealthMonitorState createState() => _HealthMonitorState();
}
class _HealthMonitorState extends State<HealthMonitor> {
late SynheartWear _sdk;
StreamSubscription<WearMetrics>? _hrSubscription;
WearMetrics? _latestMetrics;
bool _isConnected = false;
@override
void initState() {
super.initState();
_sdk = SynheartWear(
config: SynheartWearConfig.withAdapters({
DeviceAdapter.appleHealthKit,
}),
);
}
Future<void> _connect() async {
try {
final result = await _sdk.requestPermissions(
permissions: {
PermissionType.heartRate,
PermissionType.steps,
PermissionType.calories,
},
reason: 'Track your health metrics',
);
if (result.values.any((s) => s == ConsentStatus.granted)) {
await _sdk.initialize();
final metrics = await _sdk.readMetrics();
setState(() {
_isConnected = true;
_latestMetrics = metrics;
});
}
} catch (e) {
print('Error: $e');
}
}
void _startStreaming() {
_hrSubscription = _sdk
.streamHR(interval: Duration(seconds: 3))
.listen((metrics) {
setState(() => _latestMetrics = metrics);
});
}
void _stopStreaming() {
_hrSubscription?.cancel();
_hrSubscription = null;
}
@override
void dispose() {
_hrSubscription?.cancel();
_sdk.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Health Monitor')),
body: _isConnected
? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (_latestMetrics != null) ...[
Text(
'HR: ${_latestMetrics!.getMetric(MetricType.hr) ?? "--"} bpm',
style: TextStyle(fontSize: 32),
),
SizedBox(height: 16),
Text('Steps: ${_latestMetrics!.getMetric(MetricType.steps) ?? "--"}'),
Text('Calories: ${_latestMetrics!.getMetric(MetricType.calories) ?? "--"} kcal'),
SizedBox(height: 24),
],
ElevatedButton(
onPressed: _hrSubscription == null ? _startStreaming : _stopStreaming,
child: Text(_hrSubscription == null ? 'Start Streaming' : 'Stop Streaming'),
),
],
)
: Center(
child: ElevatedButton(
onPressed: _connect,
child: Text('Connect to Health'),
),
),
);
}
}