walking.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_activity_recognition/flutter_activity_recognition.dart';
  4. import 'package:geolocator/geolocator.dart' hide ActivityType;
  5. import 'package:rxdart/rxdart.dart';
  6. import '../models/score.dart';
  7. import '../services/walking_services.dart';
  8. class Walking extends StatefulWidget {
  9. Walking({Key? key}) : super(key: key);
  10. @override
  11. State<Walking> createState() => _WalkingState();
  12. }
  13. class _WalkingState extends State<Walking> {
  14. final FlutterActivityRecognition activityRecognition = FlutterActivityRecognition.instance;
  15. final StreamController<Position> _streamController = StreamController.broadcast();
  16. late Stream<dynamic> _activityPositionStream;
  17. num distance = 0;
  18. Position? lastPosition;
  19. num points = 0;
  20. int totalPoints = 0;
  21. num totalDistance = 0;
  22. @override
  23. void initState() {
  24. _activityPositionStream = CombineLatestStream.combine2(
  25. activityRecognition.activityStream,
  26. Geolocator.getPositionStream(locationSettings: LocationSettings(distanceFilter: 0)),
  27. (Activity a, Position b) => [a, b],
  28. );
  29. _activityPositionStream.listen(_calculatePoints);
  30. super.initState();
  31. }
  32. @override
  33. void dispose() {
  34. _streamController.close();
  35. super.dispose();
  36. }
  37. void _updatePoints(num newPoints) {
  38. setState(() {
  39. final currentPoints = points + newPoints;
  40. totalPoints += currentPoints.floor();
  41. points += currentPoints;
  42. });
  43. }
  44. void _updateDistance(num newDistance) {
  45. setState(() {
  46. totalDistance += newDistance;
  47. });
  48. }
  49. void _calculatePoints(dynamic activityPosition) {
  50. var activity = activityPosition[0] as Activity;
  51. var position = activityPosition[1];
  52. if (activity.type == ActivityType.WALKING || activity.type == ActivityType.RUNNING) {
  53. if (lastPosition != null) {
  54. distance = Geolocator.distanceBetween(
  55. lastPosition!.latitude, lastPosition!.longitude, position.latitude, position.longitude);
  56. _updateDistance(distance);
  57. }
  58. }
  59. if (distance > 0 && activity.type == ActivityType.WALKING) {
  60. _updatePoints(distance / 10);
  61. } else if (distance > 0 && activity.type == ActivityType.RUNNING) {
  62. _updatePoints(distance / 8);
  63. }
  64. if (activity.type != ActivityType.WALKING && activity.type != ActivityType.RUNNING && points.floor() > 0) {
  65. WalkingServices.addScore(Score(points: points.floor(), distance: 0));
  66. setState(() {
  67. points = 0;
  68. });
  69. }
  70. lastPosition = position;
  71. }
  72. @override
  73. Widget build(BuildContext context) {
  74. return Scaffold(
  75. body: Center(
  76. child: Column(
  77. mainAxisAlignment: MainAxisAlignment.center,
  78. children: [
  79. Text(
  80. "Walked distance since start:\n${totalDistance.round()} m",
  81. textAlign: TextAlign.center,
  82. style: const TextStyle(fontSize: 24),
  83. ),
  84. const SizedBox(height: 32),
  85. Text(
  86. "Earned points since start:\n$totalPoints pts",
  87. textAlign: TextAlign.center,
  88. style: const TextStyle(fontSize: 24),
  89. ),
  90. ],
  91. ),
  92. ),
  93. );
  94. }
  95. }