summaryrefslogtreecommitdiff
path: root/lib/home.dart
diff options
context:
space:
mode:
Diffstat (limited to 'lib/home.dart')
-rw-r--r--lib/home.dart90
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(),
+ ),
+ ],
+ );
+ },
),
),
);