import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_activity_recognition/flutter_activity_recognition.dart'; import 'package:geolocator/geolocator.dart' hide ActivityType; import 'package:rxdart/rxdart.dart'; import '../models/score.dart'; import '../services/walking_services.dart'; class Walking extends StatefulWidget { Walking({Key? key}) : super(key: key); @override State createState() => _WalkingState(); } class _WalkingState extends State { final FlutterActivityRecognition activityRecognition = FlutterActivityRecognition.instance; final StreamController _streamController = StreamController.broadcast(); late Stream _activityPositionStream; num distance = 0; Position? lastPosition; num points = 0; int totalPoints = 0; num totalDistance = 0; @override void initState() { _activityPositionStream = CombineLatestStream.combine2( activityRecognition.activityStream, Geolocator.getPositionStream(locationSettings: LocationSettings(distanceFilter: 0)), (Activity a, Position b) => [a, b], ); _activityPositionStream.listen(_calculatePoints); super.initState(); } @override void dispose() { _streamController.close(); super.dispose(); } void _updatePoints(num newPoints) { setState(() { final currentPoints = points + newPoints; totalPoints += currentPoints.floor(); points += currentPoints; }); } void _updateDistance(num newDistance) { setState(() { totalDistance += newDistance; }); } void _calculatePoints(dynamic activityPosition) { var activity = activityPosition[0] as Activity; var position = activityPosition[1]; if (activity.type == ActivityType.WALKING || activity.type == ActivityType.RUNNING) { if (lastPosition != null) { distance = Geolocator.distanceBetween( lastPosition!.latitude, lastPosition!.longitude, position.latitude, position.longitude); _updateDistance(distance); } } if (distance > 0 && activity.type == ActivityType.WALKING) { _updatePoints(distance / 10); } else if (distance > 0 && activity.type == ActivityType.RUNNING) { _updatePoints(distance / 8); } if (activity.type != ActivityType.WALKING && activity.type != ActivityType.RUNNING && points.floor() > 0) { WalkingServices.addScore(Score(points: points.floor(), distance: 0)); setState(() { points = 0; }); } lastPosition = position; } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( "Walked distance since start:\n${totalDistance.round()} m", textAlign: TextAlign.center, style: const TextStyle(fontSize: 24), ), const SizedBox(height: 32), Text( "Earned points since start:\n$totalPoints pts", textAlign: TextAlign.center, style: const TextStyle(fontSize: 24), ), ], ), ), ); } }