walking_counter.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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. }
  90. if (distance > 0 && activity == ActivityType.WALKING) {
  91. var points = distance / 10;
  92. WalkingServices.addScore(Score(
  93. points: points.floor(), distance: distance.floor()));
  94. }
  95. else if (distance > 0 && activity == ActivityType.RUNNING){
  96. var points = distance / 8;
  97. WalkingServices.addScore(Score(
  98. points: points.floor(), distance: distance.floor()));
  99. }
  100. lastPosition = position;
  101. print(distance);
  102. return Text("$distance");
  103. },
  104. ),
  105. ],
  106. ),
  107. ),
  108. );
  109. }
  110. }
  111. /*
  112. Get distance only when walking or running
  113. if (walking || running) {
  114. calculateScore()
  115. }
  116. */
  117. // --W---R----W----S----W------
  118. // --P--P--P--P--P--P
  119. // --[W,P]--[W,P]--[R,P]--