diff options
Diffstat (limited to 'lib/home.dart')
| -rw-r--r-- | lib/home.dart | 90 |
1 files changed, 53 insertions, 37 deletions
diff --git a/lib/home.dart b/lib/home.dart index 371a52e..f141d0b 100644 --- a/lib/home.dart +++ b/lib/home.dart @@ -2,9 +2,11 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; +import 'package:region_settings/region_settings.dart'; +import 'package:speedometer/jotai.dart'; import 'main.dart'; -import 'about.dart'; +import 'settings.dart'; extension on SpeedUnit { double fromMetersPerSecond(double metersPerSecond) => switch (this) { @@ -27,15 +29,15 @@ class HomePage extends StatefulWidget { class _HomePageState extends State<HomePage> { StreamSubscription<Position>? _positionStream; + + bool _usesMetric = true; double _speed = 0.0; double _speedAccuracy = 0.0; - SpeedUnit _speedUnit = SpeedUnit.milesPerHour; - LocationSettings _locationSettings = LocationSettings(); - void _initPositionStream() { + void _initPositionStream(LocationAccuracy locationAccuracy) { _positionStream = Geolocator.getPositionStream( - locationSettings: _locationSettings, + locationSettings: LocationSettings(accuracy: locationAccuracy), ).listen((Position? position) { if (position != null) { setState(() { @@ -61,9 +63,18 @@ class _HomePageState extends State<HomePage> { LocationPermission.deniedForever, LocationPermission.denied, ].contains(permission)) { - _initPositionStream(); + _initPositionStream(locationAccuracyObservable.value); } }); + + locationAccuracyObservable.subscribe((locationAccuracy) { + _positionStream?.cancel(); + _initPositionStream(locationAccuracy); + }); + + RegionSettings.getUsesMetricSystem().then( + (usesMetricSystem) => setState(() => _usesMetric = usesMetricSystem), + ); } @override @@ -77,41 +88,46 @@ class _HomePageState extends State<HomePage> { return Scaffold( appBar: AppBar( actions: [ - MenuAnchor( - builder: (context, controller, child) => TextButton.icon( - icon: Icon(Icons.settings), - label: Text('Settings'), - onPressed: () => - controller.isOpen ? controller.close() : controller.open(), - ), - menuChildren: [ - MenuItemButton(child: Text('Settings')), - MenuItemButton( - child: Text('About'), - onPressed: () => Navigator.push( - context, - MaterialPageRoute(builder: (context) => AboutPage()), - ), - ), - ], + TextButton.icon( + icon: Icon(Icons.settings), + label: Text('Settings'), + onPressed: () => Navigator.of( + context, + ).push(MaterialPageRoute(builder: (context) => SettingsPage())), ), ], ), body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Flex(direction: Axis.horizontal), - Text( - '${_speedUnit.fromMetersPerSecond(_speed).round()} ${_speedUnit.acronym}', - style: Theme.of(context).textTheme.displayLarge, - ), - Text( - '± ${_speedUnit.fromMetersPerSecond(_speedAccuracy).round()} ${_speedUnit.acronym}', - style: Theme.of(context).textTheme.displaySmall, - ), - ], + child: ObserverBuilder( + observable: speedUnitsObservable, + builder: (context, speedUnitsSetting, _) { + final speedUnits = + speedUnitsSetting ?? + (_usesMetric + ? SpeedUnit.kilometersPerHour + : SpeedUnit.milesPerHour); + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Flex(direction: Axis.horizontal), + Text( + '${speedUnits.fromMetersPerSecond(_speed).round()} ${speedUnits.acronym}', + style: Theme.of(context).textTheme.displayLarge, + ), + ObserverBuilder( + observable: showMarginOfErrorObservable, + builder: (context, showMarginOfError, _) => + showMarginOfError == true + ? Text( + '± ${speedUnits.fromMetersPerSecond(_speedAccuracy).round()} ${speedUnits.acronym}', + style: Theme.of(context).textTheme.displaySmall, + ) + : SizedBox(), + ), + ], + ); + }, ), ), ); |
