walking.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. int points = 0;
  20. num 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. totalPoints = newPoints;
  40. });
  41. }
  42. void _updateDistance(num newDistance) {
  43. setState(() {
  44. totalDistance += newDistance;
  45. });
  46. }
  47. void _calculatePoints(dynamic activityPosition) {
  48. var activity = activityPosition[0] as Activity;
  49. var position = activityPosition[1];
  50. if (activity.type == ActivityType.WALKING || activity.type == ActivityType.RUNNING) {
  51. if (lastPosition != null) {
  52. distance = Geolocator.distanceBetween(
  53. lastPosition!.latitude, lastPosition!.longitude, position.latitude, position.longitude);
  54. _updateDistance(distance);
  55. }
  56. }
  57. if (distance > 0 && activity.type == ActivityType.WALKING) {
  58. points += (distance / 10).floor();
  59. _updatePoints(points);
  60. } else if (distance > 0 && activity.type == ActivityType.RUNNING) {
  61. points += (distance / 8).floor();
  62. _updatePoints(points);
  63. }
  64. if (activity.type != ActivityType.WALKING && activity.type != ActivityType.RUNNING && points > 0) {
  65. WalkingServices.addScore(Score(points: points, distance: 0));
  66. points = 0;
  67. }
  68. lastPosition = position;
  69. }
  70. @override
  71. Widget build(BuildContext context) {
  72. return Scaffold(
  73. body: Center(
  74. child: Column(
  75. mainAxisAlignment: MainAxisAlignment.center,
  76. children: [
  77. Text(
  78. "Walked distance since start:\n${totalDistance.round()} m",
  79. textAlign: TextAlign.center,
  80. style: const TextStyle(fontSize: 24),
  81. ),
  82. const SizedBox(height: 32),
  83. Text(
  84. "Earned points since start:\n$totalPoints pts",
  85. textAlign: TextAlign.center,
  86. style: const TextStyle(fontSize: 24),
  87. ),
  88. ],
  89. ),
  90. ),
  91. );
  92. }
  93. }