diff options
| author | Mica White <botahamec@outlook.com> | 2025-12-28 18:50:31 -0500 |
|---|---|---|
| committer | Mica White <botahamec@outlook.com> | 2025-12-28 18:50:31 -0500 |
| commit | de2ed3cdc1a47c783c0afb378c058c16c6ed8ac8 (patch) | |
| tree | d4a2498f5439ec3b6ae3e55689daca911b77a38e /lib/home.dart | |
| parent | 40794d320d287c13e011078d09b3669af77e120f (diff) | |
Remove title from home page
Diffstat (limited to 'lib/home.dart')
| -rw-r--r-- | lib/home.dart | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/lib/home.dart b/lib/home.dart new file mode 100644 index 0000000..0235016 --- /dev/null +++ b/lib/home.dart @@ -0,0 +1,119 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:geolocator/geolocator.dart'; + +import 'main.dart'; +import 'about.dart'; + +extension on SpeedUnit { + double fromMetersPerSecond(double metersPerSecond) => switch (this) { + SpeedUnit.kilometersPerHour => metersPerSecond * 3.6, + SpeedUnit.milesPerHour => metersPerSecond * 2.236936, + }; + + String get acronym => switch (this) { + SpeedUnit.kilometersPerHour => 'kmph', + SpeedUnit.milesPerHour => 'mph', + }; +} + +class HomePage extends StatefulWidget { + const HomePage({super.key}); + + @override + State<HomePage> createState() => _HomePageState(); +} + +class _HomePageState extends State<HomePage> { + StreamSubscription<Position>? _positionStream; + double _speed = 0.0; + double _speedAccuracy = 0.0; + SpeedUnit _speedUnit = SpeedUnit.milesPerHour; + LocationSettings _locationSettings = LocationSettings(); + + void _initPositionStream() { + _positionStream = + Geolocator.getPositionStream( + locationSettings: _locationSettings, + ).listen((Position? position) { + if (position != null) { + setState(() { + _speed = position.speed; + _speedAccuracy = position.speedAccuracy; + }); + } + }); + } + + @override + void initState() { + super.initState(); + + Geolocator.checkPermission() + .then( + (permission) => permission == LocationPermission.denied + ? Geolocator.requestPermission() + : permission, + ) + .then((permission) { + if (![ + LocationPermission.deniedForever, + LocationPermission.denied, + ].contains(permission)) { + _initPositionStream(); + } + }); + } + + @override + void dispose() { + super.dispose(); + _positionStream?.cancel(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + actions: [ + MenuAnchor( + builder: (context, controller, child) => IconButton( + icon: Icon(Icons.more_vert), + onPressed: () => + controller.isOpen ? controller.close() : controller.open(), + tooltip: "Navigation menu", + ), + menuChildren: [ + MenuItemButton(child: Text('Settings')), + MenuItemButton( + child: Text('About'), + onPressed: () => Navigator.push( + context, + MaterialPageRoute(builder: (context) => AboutPage()), + ), + ), + ], + ), + ], + ), + 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, + ), + ], + ), + ), + ); + } +} |
