walking_counter.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. num points = 0;
  24. @override
  25. void initState() {
  26. // _simulatedActivityController.stream.listen(print);
  27. // activityRecognition.activityStream.listen((event) {
  28. // print(event.type);
  29. // });
  30. _activityPositionStream = CombineLatestStream.combine2(
  31. _simulatedActivityController.stream,
  32. Geolocator.getPositionStream(
  33. locationSettings: LocationSettings(distanceFilter: 0)),
  34. (ActivityType a, Position b) => [a, b],
  35. );
  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. @override
  47. Widget build(BuildContext context) {
  48. Geolocator.getPositionStream(
  49. locationSettings: LocationSettings(distanceFilter: 0))
  50. .listen((position) {
  51. _streamController.add(position);
  52. print(position);
  53. });
  54. return Scaffold(
  55. body: Center(
  56. child: Column(
  57. mainAxisAlignment: MainAxisAlignment.center,
  58. children: [
  59. ElevatedButton(
  60. onPressed: () =>
  61. _simulatedActivityController.add(ActivityType.WALKING),
  62. child: Text("WALKING"),
  63. ),
  64. ElevatedButton(
  65. onPressed: () =>
  66. _simulatedActivityController.add(ActivityType.RUNNING),
  67. child: Text("RUNNING"),
  68. ),
  69. ElevatedButton(
  70. onPressed: () =>
  71. _simulatedActivityController.add(ActivityType.STILL),
  72. child: Text("STILL"),
  73. ),
  74. StreamBuilder<dynamic>(
  75. stream: _activityPositionStream,
  76. builder: (context, snapshot) {
  77. if (!snapshot.hasData) {
  78. return CircularProgressIndicator();
  79. }
  80. var activity = snapshot.data![0];
  81. var position = snapshot.data![1];
  82. if (activity == ActivityType.WALKING || activity == ActivityType.RUNNING) {
  83. if (lastPosition != null) {
  84. distance = Geolocator.distanceBetween(
  85. lastPosition!.latitude,
  86. lastPosition!.longitude,
  87. position.latitude,
  88. position.longitude);
  89. }
  90. }
  91. if (distance > 0 && activity == ActivityType.WALKING) {
  92. points += distance / 10;
  93. }
  94. else if (distance > 0 && activity == ActivityType.RUNNING){
  95. points += distance / 8;
  96. }
  97. if (activity != ActivityType.WALKING && activity != ActivityType.RUNNING && points>0){
  98. WalkingServices.addScore(Score(
  99. points: points.floor(),distance: 0)
  100. );
  101. points=0;
  102. }
  103. lastPosition = position;
  104. print(distance);
  105. return Text("$distance");
  106. },
  107. ),
  108. ],
  109. ),
  110. ),
  111. );
  112. }
  113. }
  114. /*
  115. Get distance only when walking or running
  116. if (walking || running) {
  117. calculateScore()
  118. }
  119. */
  120. // --W---R----W----S----W------
  121. // --P--P--P--P--P--P
  122. // --[W,P]--[W,P]--[R,P]--