walking.dart 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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. final StreamController<ActivityType> _simulatedActivityController = StreamController.broadcast();
  17. late Stream<dynamic> _activityPositionStream;
  18. num distance = 0;
  19. Position? lastPosition;
  20. num points = 0;
  21. num totalPoints = 0;
  22. num totalDistance = 0;
  23. @override
  24. void initState() {
  25. // _simulatedActivityController.stream.listen(print);
  26. // activityRecognition.activityStream.listen((event) {
  27. // print(event.type);
  28. // });
  29. _activityPositionStream = CombineLatestStream.combine2(
  30. activityRecognition.activityStream,
  31. // _simulatedActivityController.stream,
  32. Geolocator.getPositionStream(locationSettings: LocationSettings(distanceFilter: 10)),
  33. (dynamic a, Position b) => [a, b],
  34. );
  35. _activityPositionStream.listen(_calculatePoints);
  36. super.initState();
  37. }
  38. @override
  39. void dispose() {
  40. _streamController.close();
  41. super.dispose();
  42. }
  43. void addScore() {
  44. WalkingServices.addScore(Score(points: 45, distance: 500));
  45. }
  46. void _updatePoints(num newPoints) {
  47. setState(() {
  48. totalPoints += newPoints;
  49. });
  50. }
  51. void _updateDistance(num newDistance) {
  52. setState(() {
  53. totalDistance += newDistance;
  54. });
  55. }
  56. void _calculatePoints(dynamic activityPosition) {
  57. var activity = activityPosition[0];
  58. var position = activityPosition[1];
  59. if (activity == ActivityType.WALKING || activity == ActivityType.RUNNING) {
  60. if (lastPosition != null) {
  61. distance = Geolocator.distanceBetween(
  62. lastPosition!.latitude, lastPosition!.longitude, position.latitude, position.longitude);
  63. _updateDistance(distance);
  64. }
  65. }
  66. if (distance > 0 && activity == ActivityType.WALKING) {
  67. points += distance / 10;
  68. _updatePoints(points);
  69. } else if (distance > 0 && activity == ActivityType.RUNNING) {
  70. points += distance / 8;
  71. _updatePoints(points);
  72. }
  73. if (activity != ActivityType.WALKING && activity != ActivityType.RUNNING && points > 0) {
  74. WalkingServices.addScore(Score(points: points.floor(), distance: 0));
  75. points = 0;
  76. }
  77. lastPosition = position;
  78. }
  79. @override
  80. Widget build(BuildContext context) {
  81. Geolocator.getPositionStream(locationSettings: LocationSettings(distanceFilter: 0)).listen((position) {
  82. _streamController.add(position);
  83. print(position);
  84. });
  85. return Scaffold(
  86. body: Center(
  87. child: Column(
  88. mainAxisAlignment: MainAxisAlignment.center,
  89. children: [
  90. Text(
  91. "Walked distance since start:\n$totalDistance m",
  92. textAlign: TextAlign.center,
  93. style: const TextStyle(fontSize: 24),
  94. ),
  95. const SizedBox(height: 32),
  96. Text(
  97. "Earned points since start:\n$totalPoints pts",
  98. textAlign: TextAlign.center,
  99. style: const TextStyle(fontSize: 24),
  100. ),
  101. // ElevatedButton(
  102. // onPressed: () => _simulatedActivityController.add(ActivityType.WALKING),
  103. // child: Text("WALKING"),
  104. // ),
  105. // ElevatedButton(
  106. // onPressed: () => _simulatedActivityController.add(ActivityType.RUNNING),
  107. // child: Text("RUNNING"),
  108. // ),
  109. // ElevatedButton(
  110. // onPressed: () => _simulatedActivityController.add(ActivityType.STILL),
  111. // child: Text("STILL"),
  112. // ),
  113. // StreamBuilder<dynamic>(
  114. // stream: _activityPositionStream,
  115. // builder: (context, snapshot) {
  116. // if (!snapshot.hasData) {
  117. // return CircularProgressIndicator();
  118. // }
  119. // var activity = snapshot.data![0];
  120. // var position = snapshot.data![1];
  121. // if (activity == ActivityType.WALKING || activity == ActivityType.RUNNING) {
  122. // if (lastPosition != null) {
  123. // distance = Geolocator.distanceBetween(
  124. // lastPosition!.latitude, lastPosition!.longitude, position.latitude, position.longitude);
  125. // }
  126. // }
  127. // if (distance > 0 && activity == ActivityType.WALKING) {
  128. // points += distance / 10;
  129. // } else if (distance > 0 && activity == ActivityType.RUNNING) {
  130. // points += distance / 8;
  131. // }
  132. // if (activity != ActivityType.WALKING && activity != ActivityType.RUNNING && points > 0) {
  133. // WalkingServices.addScore(Score(points: points.floor(), distance: 0));
  134. // points = 0;
  135. // }
  136. // lastPosition = position;
  137. // print(distance);
  138. // return Text("$distance");
  139. // },
  140. // ),
  141. ],
  142. ),
  143. ),
  144. );
  145. }
  146. }
  147. /*
  148. Get distance only when walking or running
  149. if (walking || running) {
  150. calculateScore()
  151. }
  152. */
  153. // --W---R----W----S----W------
  154. // --P--P--P--P--P--P
  155. // --[W,P]--[W,P]--[R,P]--