walking_counter.dart 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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 WalkingCounter extends StatefulWidget {
  9. WalkingCounter({Key? key}) : super(key: key);
  10. @override
  11. State<WalkingCounter> createState() => _WalkingCounterState();
  12. }
  13. class _WalkingCounterState extends State<WalkingCounter> {
  14. final FlutterActivityRecognition activityRecognition =
  15. FlutterActivityRecognition.instance;
  16. final StreamController<Position> _streamController =
  17. StreamController.broadcast();
  18. final StreamController<ActivityType> _simulatedActivityController =
  19. StreamController.broadcast();
  20. late Stream<dynamic> _activityPositionStream;
  21. num distance = 0;
  22. Position? lastPosition;
  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. _simulatedActivityController.stream,
  31. Geolocator.getPositionStream(
  32. locationSettings: LocationSettings(distanceFilter: 0)),
  33. (ActivityType a, Position b) => [a, b],
  34. );
  35. super.initState();
  36. }
  37. @override
  38. void dispose() {
  39. _streamController.close();
  40. super.dispose();
  41. }
  42. void addScore() {
  43. WalkingServices.addScore(Score(points: 45, distance: 500));
  44. }
  45. @override
  46. Widget build(BuildContext context) {
  47. Geolocator.getPositionStream(
  48. locationSettings: LocationSettings(distanceFilter: 0))
  49. .listen((position) {
  50. _streamController.add(position);
  51. print(position);
  52. });
  53. return Scaffold(
  54. body: Center(
  55. child: Column(
  56. mainAxisAlignment: MainAxisAlignment.center,
  57. children: [
  58. ElevatedButton(
  59. onPressed: () =>
  60. _simulatedActivityController.add(ActivityType.WALKING),
  61. child: Text("WALKING"),
  62. ),
  63. ElevatedButton(
  64. onPressed: () =>
  65. _simulatedActivityController.add(ActivityType.RUNNING),
  66. child: Text("RUNNING"),
  67. ),
  68. ElevatedButton(
  69. onPressed: () =>
  70. _simulatedActivityController.add(ActivityType.STILL),
  71. child: Text("STILL"),
  72. ),
  73. StreamBuilder<dynamic>(
  74. stream: _activityPositionStream,
  75. builder: (context, snapshot) {
  76. if (!snapshot.hasData) {
  77. return CircularProgressIndicator();
  78. }
  79. var activity = snapshot.data![0];
  80. var position = snapshot.data![1];
  81. if (activity == ActivityType.WALKING || activity == ActivityType.RUNNING) {
  82. if (lastPosition != null) {
  83. distance += Geolocator.distanceBetween(
  84. lastPosition!.latitude,
  85. lastPosition!.longitude,
  86. position.latitude,
  87. position.longitude);
  88. }
  89. // } else if (activity == ActivityType.RUNNING) {
  90. // if (lastPosition != null) {
  91. // distance += Geolocator.distanceBetween(
  92. // lastPosition!.latitude,
  93. // lastPosition!.longitude,
  94. // position.latitude,
  95. // position.longitude);
  96. // }
  97. }
  98. if (distance > 0 && activity == ActivityType.WALKING) {
  99. var points = distance / 10;
  100. WalkingServices.addScore(Score(
  101. points: points.floor(), distance: distance.floor()));
  102. }
  103. else if (distance > 0 && activity == ActivityType.RUNNING){
  104. var points = distance / 8;
  105. WalkingServices.addScore(Score(
  106. points: points.floor(), distance: distance.floor()));
  107. }
  108. lastPosition = position;
  109. print(distance);
  110. return Text("$distance");
  111. },
  112. ),
  113. ],
  114. ),
  115. ),
  116. );
  117. }
  118. }
  119. /*
  120. Get distance only when walking or running
  121. if (walking || running) {
  122. calculateScore()
  123. }
  124. */
  125. // --W---R----W----S----W------
  126. // --P--P--P--P--P--P
  127. // --[W,P]--[W,P]--[R,P]--