| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- import 'dart:async';
- import 'package:flutter/material.dart';
- import 'package:flutter_activity_recognition/flutter_activity_recognition.dart';
- import 'package:geolocator/geolocator.dart' hide ActivityType;
- import 'package:rxdart/rxdart.dart';
- import '../models/score.dart';
- import '../services/walking_services.dart';
- class Walking extends StatefulWidget {
- Walking({Key? key}) : super(key: key);
- @override
- State<Walking> createState() => _WalkingState();
- }
- class _WalkingState extends State<Walking> {
- final FlutterActivityRecognition activityRecognition = FlutterActivityRecognition.instance;
- final StreamController<Position> _streamController = StreamController.broadcast();
- late Stream<dynamic> _activityPositionStream;
- num distance = 0;
- Position? lastPosition;
- num points = 0;
- num totalPoints = 0;
- num totalDistance = 0;
- @override
- void initState() {
- _activityPositionStream = CombineLatestStream.combine2(
- activityRecognition.activityStream,
- Geolocator.getPositionStream(locationSettings: LocationSettings(distanceFilter: 0)),
- (Activity a, Position b) => [a, b],
- );
- _activityPositionStream.listen(_calculatePoints);
- super.initState();
- }
- @override
- void dispose() {
- _streamController.close();
- super.dispose();
- }
- void _updatePoints(num newPoints) {
- setState(() {
- totalPoints += newPoints;
- points += newPoints;
- });
- }
- void _updateDistance(num newDistance) {
- setState(() {
- totalDistance += newDistance;
- });
- }
- void _calculatePoints(dynamic activityPosition) {
- var activity = activityPosition[0] as Activity;
- var position = activityPosition[1];
- if (activity.type == ActivityType.WALKING || activity.type == ActivityType.RUNNING) {
- if (lastPosition != null) {
- distance = Geolocator.distanceBetween(
- lastPosition!.latitude, lastPosition!.longitude, position.latitude, position.longitude);
- _updateDistance(distance);
- }
- }
- if (distance > 0 && activity.type == ActivityType.WALKING) {
- _updatePoints(distance / 10);
- } else if (distance > 0 && activity.type == ActivityType.RUNNING) {
- _updatePoints(distance / 8);
- }
- if (activity.type != ActivityType.WALKING && activity.type != ActivityType.RUNNING && points.floor() > 0) {
- WalkingServices.addScore(Score(points: points.floor(), distance: 0));
- setState(() {
- points = 0;
- });
- }
- lastPosition = position;
- }
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- body: Center(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- Text(
- "Walked distance since start:\n${totalDistance.round()} m",
- textAlign: TextAlign.center,
- style: const TextStyle(fontSize: 24),
- ),
- const SizedBox(height: 32),
- Text(
- "Earned points since start:\n${totalPoints.floor()} pts",
- textAlign: TextAlign.center,
- style: const TextStyle(fontSize: 24),
- ),
- ],
- ),
- ),
- );
- }
- }
|