From 17350d798de43f6c764713d43026cf54b5f0f436 Mon Sep 17 00:00:00 2001 From: Michael Thomas Date: Thu, 1 Sep 2022 13:48:33 -0400 Subject: [PATCH] Display user location on map --- android/app/build.gradle | 3 +- android/app/src/main/AndroidManifest.xml | 1 + lib/src/screens/map/index.dart | 42 ++++++++++++++++ pubspec.lock | 61 ++++++++++++++++++++++++ pubspec.yaml | 1 + 5 files changed, 107 insertions(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 711ac01..61c4a3c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -47,8 +47,9 @@ android { applicationId "edu.furman.now" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. - minSdkVersion flutter.minSdkVersion + minSdkVersion 23 targetSdkVersion flutter.targetSdkVersion + compileSdkVersion 33 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 9da0164..c0bc049 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -34,4 +34,5 @@ + diff --git a/lib/src/screens/map/index.dart b/lib/src/screens/map/index.dart index e44c56c..c6d4283 100644 --- a/lib/src/screens/map/index.dart +++ b/lib/src/screens/map/index.dart @@ -1,5 +1,8 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; +import 'package:flutter_map_location_marker/flutter_map_location_marker.dart'; import 'package:flutter_svg/svg.dart'; import 'package:furman_now/src/utils/theme.dart'; import 'package:furman_now/src/widgets/map/filter_chip.dart'; @@ -22,6 +25,9 @@ class _MapScreenState extends State vsync: this, ); + late CenterOnLocationUpdate _centerOnLocationUpdate; + late StreamController _centerCurrentLocationStreamController; + var _rotation = 0.0; @override @@ -34,6 +40,8 @@ class _MapScreenState extends State }); } }); + _centerOnLocationUpdate = CenterOnLocationUpdate.always; + _centerCurrentLocationStreamController = StreamController(); } @override @@ -89,6 +97,20 @@ class _MapScreenState extends State zoom: 15, minZoom: 12, maxZoom: 18, + plugins: [ + LocationMarkerPlugin( + centerCurrentLocationStream: + _centerCurrentLocationStreamController.stream, + centerOnLocationUpdate: _centerOnLocationUpdate, + ), + ], + onPositionChanged: (MapPosition position, bool hasGesture) { + if (hasGesture) { + setState( + () => _centerOnLocationUpdate = CenterOnLocationUpdate.never, + ); + } + }, ), layers: [ TileLayerOptions( @@ -96,6 +118,7 @@ class _MapScreenState extends State "https://tile.openstreetmap.org/{z}/{x}/{y}.png", userAgentPackageName: 'edu.furman.now', ), + LocationMarkerLayerOptions(), ], nonRotatedChildren: [ AttributionWidget( @@ -111,6 +134,7 @@ class _MapScreenState extends State ), ], ), + // Rotation reset fab Positioned( top: 12, left: 0, @@ -177,6 +201,24 @@ class _MapScreenState extends State ), ), ), + Positioned( + right: 20, + bottom: 20, + child: FloatingActionButton( + onPressed: () { + // Automatically center the location marker on the map when location updated until user interact with the map. + setState( + () => _centerOnLocationUpdate = CenterOnLocationUpdate.always, + ); + // Center the location marker on the map and zoom the map to level 18. + _centerCurrentLocationStreamController.add(16); + }, + child: const Icon( + Icons.my_location, + color: Colors.white, + ), + ) + ) ], ), ), diff --git a/pubspec.lock b/pubspec.lock index f6aab83..37fb60d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -146,6 +146,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_compass: + dependency: transitive + description: + name: flutter_compass + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.0" flutter_lints: dependency: "direct dev" description: @@ -160,6 +167,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.2.0" + flutter_map_location_marker: + dependency: "direct main" + description: + name: flutter_map_location_marker + url: "https://pub.dartlang.org" + source: hosted + version: "4.1.4" flutter_svg: dependency: "direct main" description: @@ -172,6 +186,11 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" frontend_server_client: dependency: transitive description: @@ -179,6 +198,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.3" + geolocator: + dependency: transitive + description: + name: geolocator + url: "https://pub.dartlang.org" + source: hosted + version: "9.0.1" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + url: "https://pub.dartlang.org" + source: hosted + version: "4.1.0" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.6" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.6" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1" glob: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ee7aef3..7f68f31 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -48,6 +48,7 @@ dependencies: palette_generator: ^0.3.3+2 flutter_svg: ^1.1.4 auto_route: ^5.0.1 + flutter_map_location_marker: ^4.1.4 dev_dependencies: flutter_test: