diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 32ea881..ea15bda 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -41,4 +41,6 @@ + + diff --git a/lib/state/mapState.dart b/lib/state/mapState.dart index 9da94ee..945733b 100644 --- a/lib/state/mapState.dart +++ b/lib/state/mapState.dart @@ -1,22 +1,18 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_map/flutter_map.dart'; +import 'package:geolocator/geolocator.dart'; class MapState extends ChangeNotifier { - bool _isLocationLock = false; - bool _isCurrentlyFetchin = false; + bool _isCurrentlyLoading = false; final MapController _mapController = MapController(); + final Geolocator _geolocator = Geolocator(); - bool get followLocation => _isLocationLock; - bool get isCurrentlyFetching => _isCurrentlyFetchin; + bool get isCurrentlyLoading => _isCurrentlyLoading; MapController get getMapController => _mapController; + Geolocator get getGeolocator => _geolocator; - toggleLocationLock() { - _isLocationLock = !_isLocationLock; - notifyListeners(); - } - - set setNetworkActivity(bool active) { - _isCurrentlyFetchin = active; + void setLoading(bool loading) { + _isCurrentlyLoading = loading; notifyListeners(); } } \ No newline at end of file diff --git a/lib/view/home.dart b/lib/view/home.dart index 9bc7c9a..15a1e2a 100644 --- a/lib/view/home.dart +++ b/lib/view/home.dart @@ -1,4 +1,3 @@ - import 'package:app/extensions/obtainProviderExtension.dart'; import 'package:app/state/mapState.dart'; import 'package:app/state/timeStatusState.dart'; @@ -8,6 +7,8 @@ import 'package:app/view/appInfo.dart'; import 'package:app/view/status.dart'; import 'package:app/view/map.dart'; import 'package:flutter/material.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:latlong2/latlong.dart'; import 'package:provider/provider.dart'; class HomeView extends StatefulWidget { @@ -18,6 +19,30 @@ class HomeView extends StatefulWidget { } class _HomePageState extends State { + bool locationEnabled = false; + + Future getLatLng() async { + LocationPermission permissionStatus = await Geolocator.checkPermission(); + if (permissionStatus == LocationPermission.denied) { + permissionStatus = await Geolocator.requestPermission(); + if (permissionStatus == LocationPermission.denied || permissionStatus == LocationPermission.deniedForever) { + return null; + } + } + + Position? position; + try { + position = await Geolocator.getCurrentPosition(); + } catch (e) { + position = await Geolocator.getLastKnownPosition(); + } + + if (position != null) { + return LatLng(position.latitude, position.longitude); + } + return null; + } + @override Widget build(BuildContext context) { return Scaffold( @@ -43,8 +68,25 @@ class _HomePageState extends State { ], ), floatingActionButton: FloatingActionButton( - child: WatchState((context, state) => Icon(state.followLocation ? Icons.my_location : Icons.location_disabled)), - onPressed: () => context.obtainState().toggleLocationLock(), + child: WatchState((context, state) => Icon( + locationEnabled + ? state.isCurrentlyLoading + ? Icons.location_searching + : Icons.my_location + : Icons.location_disabled + )), + onPressed: () async { + MapState mapState = context.obtainState(); + mapState.setLoading(true); + LatLng? latLng = await getLatLng(); + if (latLng != null) { + mapState.getMapController.move(latLng, 16); + setState(() { + locationEnabled = true; + }); + } + mapState.setLoading(false); + }, ), body: Column( children: [ @@ -61,7 +103,7 @@ class _HomePageState extends State { builder: (context, state, child) { return LoadingContainer( loading: child == null, - fetching: state.isCurrentlyFetching, + fetching: state.isCurrentlyLoading, child: const MapView(), ); }, diff --git a/pubspec.lock b/pubspec.lock index 1a142e6..4769651 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -121,6 +121,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -176,6 +184,54 @@ packages: description: flutter source: sdk version: "0.0.0" + geolocator: + dependency: "direct main" + description: + name: geolocator + sha256: "694ec58afe97787b5b72b8a0ab78c1a9244811c3c10e72c4362ef3c0ceb005cd" + url: "https://pub.dev" + source: hosted + version: "11.0.0" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: f15d1536cd01b1399578f1da1eb5d566e7a718db6a3648f2c24d2e2f859f0692 + url: "https://pub.dev" + source: hosted + version: "4.5.4" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: bc2aca02423ad429cb0556121f56e60360a2b7d694c8570301d06ea0c00732fd + url: "https://pub.dev" + source: hosted + version: "2.3.7" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: "009a21c4bc2761e58dccf07c24f219adaebe0ff707abdfd40b0a763d4003fab9" + url: "https://pub.dev" + source: hosted + version: "4.2.2" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: "49d8f846ebeb5e2b6641fe477a7e97e5dd73f03cbfef3fd5c42177b7300fb0ed" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "53da08937d07c24b0d9952eb57a3b474e29aae2abf9dd717f7e1230995f13f0e" + url: "https://pub.dev" + source: hosted + version: "0.2.3" html: dependency: transitive description: @@ -344,6 +400,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.2" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" pointycastle: dependency: transitive description: @@ -389,6 +453,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: @@ -453,6 +525,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.2" + uuid: + dependency: transitive + description: + name: uuid + sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 + url: "https://pub.dev" + source: hosted + version: "4.3.3" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index e373df3..990f68f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -42,6 +42,7 @@ dependencies: latlong2: ^0.9.0 http: ^1.2.1 flutter_timer_countdown: ^1.0.7 + geolocator: ^11.0.0 dev_dependencies: flutter_test: