From 421398f96e751ce4455a15ce244cef8473f0b678 Mon Sep 17 00:00:00 2001 From: Enzo Date: Mon, 20 Nov 2023 15:36:33 +0100 Subject: [PATCH] Home + Maps --- lib/common_widget/graph/altitude_by_time.dart | 9 +- lib/common_widget/stats.dart | 5 +- lib/modele/activity.dart | 134 +++++++++------ lib/modele/utile/maps/maps_utile.dart | 16 ++ lib/view/home/mobile/mobile_homeview.dart | 56 +++++-- lib/view/home/web/web_homeview.dart | 33 ++-- lib/view/map/mobile/mobile_my_map.dart | 46 ++++++ lib/view/map/my_map.dart | 155 ++---------------- lib/view/map/web/web_my_map.dart | 47 ++++++ lib/view/ne_pas_supprimer/map.txt | 131 +++++++++++++++ web/index.html | 3 + 11 files changed, 421 insertions(+), 214 deletions(-) create mode 100644 lib/modele/utile/maps/maps_utile.dart create mode 100644 lib/view/map/mobile/mobile_my_map.dart create mode 100644 lib/view/map/web/web_my_map.dart create mode 100644 lib/view/ne_pas_supprimer/map.txt diff --git a/lib/common_widget/graph/altitude_by_time.dart b/lib/common_widget/graph/altitude_by_time.dart index ff8c2b7..fcdd9ca 100644 --- a/lib/common_widget/graph/altitude_by_time.dart +++ b/lib/common_widget/graph/altitude_by_time.dart @@ -28,6 +28,9 @@ class _GraphAltitudeByTime extends State { LineChartBarData( spots: widget.data.altitudeSeconde, isCurved: false, + gradient: LinearGradient( + colors: TColor.primaryG, + ), dotData: const FlDotData(show: false)) ]; @@ -43,7 +46,7 @@ class _GraphAltitudeByTime extends State { gridData: FlGridData( drawVerticalLine: false, drawHorizontalLine: true, - horizontalInterval: 1, + horizontalInterval: (maxY - minY) / 5, getDrawingHorizontalLine: (value) { return FlLine( color: TColor.gray.withOpacity(0.15), @@ -56,10 +59,10 @@ class _GraphAltitudeByTime extends State { bottomTitles: const AxisTitles(), rightTitles: AxisTitles( sideTitles: SideTitles( - reservedSize: 50, + reservedSize: 60, showTitles: true, getTitlesWidget: (value, meta) { - return Text("${value.toInt()} m"); + return Text("${double.parse(value.toStringAsFixed(2))} m"); }, )), )))); diff --git a/lib/common_widget/stats.dart b/lib/common_widget/stats.dart index 2fcb512..1591d68 100644 --- a/lib/common_widget/stats.dart +++ b/lib/common_widget/stats.dart @@ -13,7 +13,8 @@ class Stats extends StatelessWidget { .getTotalCalorie(); String heartrate = Provider.of(context, listen: false) .listActivity[0] - .getTotalAvgHeartRate(); + .getAvgBpm() + .toString(); String time = Provider.of(context, listen: false) .listActivity[0] .getTotalTime(); @@ -152,8 +153,6 @@ class InfoStat extends StatelessWidget { } } - - class StatIcon extends StatelessWidget { const StatIcon({ Key? key, diff --git a/lib/modele/activity.dart b/lib/modele/activity.dart index bb525cb..6e7d6ca 100644 --- a/lib/modele/activity.dart +++ b/lib/modele/activity.dart @@ -1,4 +1,5 @@ import 'package:fl_chart/fl_chart.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:smartfit_app_mobile/common_widget/graph/graph.dart'; class ActivityOfUser { @@ -27,6 +28,7 @@ class ActivityOfUser { return 0; } + // ----------------- BPM ------------------ // List getHeartRateWithTime() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -53,6 +55,35 @@ class ActivityOfUser { return result; } + int getMaxBpm() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "max_heart_rate") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0; + } + + int getMinBpm() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "min_heart_rate") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0; + } + + int getAvgBpm() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "avg_heart_rate") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0; + } + // -------------------------- FIN BPM ---------------------- // + + // ---------------------- Distance ---------------------- // List getDistanceWithTime() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -70,6 +101,18 @@ class ActivityOfUser { return result; } + String getTotalDistance() { + for (int i = 0; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "total_distance") { + return _contentActivity[_dataSession][i + 1].toString(); + } + } + return "null"; + } + + // ---------------------- FIN Distance ---------------------- // + + // ---------------------- Calories ---------------------- // List getCalories() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -88,41 +131,6 @@ class ActivityOfUser { return result; } - String getTotalSteps() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "total_strides") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } - - String getMaxBpm() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "max_heart_rate") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } - String getMinBpm() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "min_heart_rate") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } - - String getAvgBpm() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "avg_heart_rate") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } - String getTotalCalorie() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "total_calories") { @@ -132,15 +140,20 @@ class ActivityOfUser { return "null"; } - String getTotalAvgHeartRate() { + // ---------------------- FIN Calories ---------------------- // + + // ---------------------- Step ------------------------------// + String getTotalSteps() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "avg_heart_rate") { + if (_contentActivity[_dataSession][i] == "total_strides") { return _contentActivity[_dataSession][i + 1].toString(); } } return "null"; } + // ----------------------- FIN Step ------------------------ // + // ------------------------- Time ----------------------------- // String getTotalTime() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "total_elapsed_time") { @@ -149,15 +162,7 @@ class ActivityOfUser { } return "null"; } - - String getTotalDistance() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "total_distance") { - return _contentActivity[_dataSession][i + 1].toString(); - } - } - return "null"; - } + // ---------------------------- FIN time -------------------- // // ---------------------------------------- Altitude -------------------- // List getAltitudeWithTime() { @@ -196,6 +201,8 @@ class ActivityOfUser { } // -------------------------- FIN altitude ---------------------- // + // -------------------------- Speed ---------------------- // + List getSpeedWithTime() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -244,6 +251,41 @@ class ActivityOfUser { return result; } + double getMaxSpeed() { + for (int i = 4; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "max_speed") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0.0; + } + + double getAvgSpeed() { + for (int i = 4; i < _contentActivity[_dataSession].length; i++) { + if (_contentActivity[_dataSession][i] == "avg_speed") { + return _contentActivity[_dataSession][i + 1]; + } + } + return 0.0; + } + + // -------------------------- FIN Speed ---------------------- // + + // -------------------------- Localisation ------------------- // + + List getPosition() { + List list = List.empty(growable: true); + + for (List ligne in _contentActivity) { + if (ligne[0] == "Data" && ligne[6] == "position_lat") { + list.add(LatLng(ligne[7], ligne[10])); + } + } + return list; + } + + // -------------------------- FIN Localisation ---------------------- // + Map toMap() { return { 'nomActivite': _nomActivite, diff --git a/lib/modele/utile/maps/maps_utile.dart b/lib/modele/utile/maps/maps_utile.dart new file mode 100644 index 0000000..e74c450 --- /dev/null +++ b/lib/modele/utile/maps/maps_utile.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:provider/provider.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; + +class MapUtil { + Set initPolines(BuildContext context, int largueur, Color couleur) { + Set _polylines = {}; + _polylines.add(Polyline( + polylineId: const PolylineId("Polyline"), + color: couleur, + points: context.watch().listActivity[0].getPosition(), + width: largueur)); + return _polylines; + } +} diff --git a/lib/view/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart index f8a23cc..b051c31 100644 --- a/lib/view/home/mobile/mobile_homeview.dart +++ b/lib/view/home/mobile/mobile_homeview.dart @@ -24,9 +24,18 @@ class _MobileHomeView extends State { @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; - String maxBpm = context.watch().listActivity[0].getMaxBpm(); - String minBpm = context.watch().listActivity[0].getMinBpm(); - String avgBpm = context.watch().listActivity[0].getAvgBpm(); + // -- BPM -- // + int maxBpm = context.watch().listActivity[0].getMaxBpm(); + int minBpm = context.watch().listActivity[0].getMinBpm(); + int avgBpm = context.watch().listActivity[0].getAvgBpm(); + // -- Altitude -- // + double minAltitude = context.watch().listActivity[0].getMinAltitude(); + double maxAltitude = context.watch().listActivity[0].getMaxAltitude(); + double avgAltitude = (maxAltitude + minAltitude) / 2; + // -- Speed -- // + double maxSpeed = context.watch().listActivity[0].getMaxSpeed(); + double avgSpeed = context.watch().listActivity[0].getAvgSpeed(); + data = HomeViewUtil().initData(context); return Scaffold( @@ -57,9 +66,9 @@ class _MobileHomeView extends State { height: media.width * 0.05, ), LigneContainerStats( - "$minBpm BPM", - "$maxBpm BPM", - "$avgBpm BPM", + "${minBpm.toString()} BPM", + "${maxBpm.toString()} BPM", + "${avgBpm.toString()} BPM", "Minimum", "Maximum", "Moyenne", @@ -85,10 +94,36 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats( - "30 BPM", - "90 BPM", - "290 BPM", + LigneContainerStats( + "${double.parse(maxSpeed.toStringAsFixed(2))} KM/H", + "${double.parse(avgSpeed.toStringAsFixed(2))} km/H", + "${avgBpm.toString()} BPM", + "Max Speed", + "Moyenne Speed", + "Moyenne BPM", + Icons.trending_down, + Icons.trending_up, + Icons.favorite_outline), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Altitude", + style: TextStyle( + color: TColor.black, + fontSize: 16, + fontWeight: FontWeight.w700), + ), + ], + ), + SizedBox( + height: media.width * 0.05, + ), + GraphAltitudeByTime(media, data), + LigneContainerStats( + "${minAltitude.toInt()} M", + "${maxAltitude.toInt()} M", + "${avgAltitude.toInt()} M", "Minimum", "Maximum", "Moyenne", @@ -98,7 +133,6 @@ class _MobileHomeView extends State { SizedBox( height: media.width * 0.05, ), - GraphAltitudeByTime(media, data) ], ), ), diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index 0976901..adeff48 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -24,9 +24,17 @@ class _WebHomeView extends State { @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; - String maxBpm = context.watch().listActivity[0].getMaxBpm(); - String minBpm = context.watch().listActivity[0].getMinBpm(); - String avgBpm = context.watch().listActivity[0].getAvgBpm(); + // -- BPM -- // + int maxBpm = context.watch().listActivity[0].getMaxBpm(); + int minBpm = context.watch().listActivity[0].getMinBpm(); + int avgBpm = context.watch().listActivity[0].getAvgBpm(); + // -- Altitude -- // + double minAltitude = context.watch().listActivity[0].getMinAltitude(); + double maxAltitude = context.watch().listActivity[0].getMaxAltitude(); + double avgAltitude = (maxAltitude + minAltitude) / 2; + // -- Speed -- // + double maxSpeed = context.watch().listActivity[0].getMaxSpeed(); + double avgSpeed = context.watch().listActivity[0].getAvgSpeed(); data = HomeViewUtil().initData(context); @@ -61,9 +69,9 @@ class _WebHomeView extends State { height: media.width * 0.05, ), LigneContainerStats( - "$minBpm BPM", - "$maxBpm BPM", - "$avgBpm BPM", + "${double.parse(maxSpeed.toStringAsFixed(2))} KM/H", + "${double.parse(avgSpeed.toStringAsFixed(2))} km/H", + "${avgBpm.toString()} BPM", "Minimum", "Maximum", "Moyenne", @@ -92,10 +100,10 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.05, ), - const LigneContainerStats( - "30 BPM", - "90 BPM", - "290 BPM", + LigneContainerStats( + "${minAltitude.toInt()} M", + "${maxAltitude.toInt()} M", + "${avgAltitude.toInt()} M", "Minimum", "Maximum", "Moyenne", @@ -105,7 +113,10 @@ class _WebHomeView extends State { SizedBox( height: media.width * 0.05, ), - GraphAltitudeByTime(media, data) + GraphAltitudeByTime(media, data), + SizedBox( + height: media.width * 0.05, + ), ], ), ), diff --git a/lib/view/map/mobile/mobile_my_map.dart b/lib/view/map/mobile/mobile_my_map.dart new file mode 100644 index 0000000..a3b35dc --- /dev/null +++ b/lib/view/map/mobile/mobile_my_map.dart @@ -0,0 +1,46 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/modele/utile/maps/maps_utile.dart'; + +class MobileMyMaps extends StatefulWidget { + const MobileMyMaps({super.key}); + + @override + State createState() => _MobileMyMaps(); +} + +class _MobileMyMaps extends State { + final Completer _googleMapController = Completer(); + CameraPosition? _cameraPosition; + Set _polylines = {}; + + @override + Widget build(BuildContext context) { + _polylines = MapUtil().initPolines(context, 10, TColor.primaryColor1); + _cameraPosition = + CameraPosition(target: _polylines.first.points.first, zoom: 18); + + return Scaffold( + body: _getMap(), + ); + } + + Widget _getMap() { + return Stack( + children: [ + GoogleMap( + initialCameraPosition: _cameraPosition!, + mapType: MapType.normal, + onMapCreated: (GoogleMapController controller) { + if (!_googleMapController.isCompleted) { + _googleMapController.complete(controller); + } + }, + polylines: _polylines, + ) + ], + ); + } +} diff --git a/lib/view/map/my_map.dart b/lib/view/map/my_map.dart index 272fe38..64b3609 100644 --- a/lib/view/map/my_map.dart +++ b/lib/view/map/my_map.dart @@ -1,154 +1,29 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; -import 'package:location/location.dart'; -import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:provider/provider.dart'; +import 'package:responsive_builder/responsive_builder.dart'; +import 'package:smartfit_app_mobile/modele/user.dart'; +import 'package:smartfit_app_mobile/view/map/mobile/mobile_my_map.dart'; +import 'package:smartfit_app_mobile/view/map/web/web_my_map.dart'; +import 'package:smartfit_app_mobile/view/profile/profile_view.dart'; class MyMap extends StatefulWidget { - const MyMap({ Key? key }) : super(key: key); + const MyMap({Key? key}) : super(key: key); @override State createState() => _MyMapState(); } class _MyMapState extends State { - - Completer _googleMapController = Completer(); - CameraPosition? _cameraPosition; - Location? _location; - LocationData? _currentLocation; - List _polylineCoordinates = []; - Set _polylines = {}; - Set _markers = {}; // Add a set to store markers - - @override - void initState() { - _init(); - super.initState(); - } - - _init() async { - _location = Location(); - _cameraPosition = CameraPosition( - target: LatLng(0, 0), // this is just the example lat and lng for initializing - zoom: 20 - ); - _initLocation(); - } - - //function to listen when we move position - _initLocation() { - - _location?.getLocation().then((location) { - _currentLocation = location; - }); - - _location?.onLocationChanged.listen((newLocation) { - setState(() { - _currentLocation = newLocation; - _polylineCoordinates.add(LatLng( - _currentLocation?.latitude ?? 0, - _currentLocation?.longitude ?? 0, - )); - _updatePolyline(); - - }); - - moveToPosition(LatLng(_currentLocation?.latitude ?? 0, - _currentLocation?.longitude ?? 0)); - }); - } - - _updatePolyline() { - setState(() { - _polylines.clear(); - _polylines.add(Polyline( - polylineId: PolylineId("polyline"), - color: TColor.primaryColor1, - points: _polylineCoordinates, - width: 10, - )); - }); - } - - // Updated _updateMarker to use the custom marker - _updateMarker(LatLng position) async { - final markerId = MarkerId('marker'); - final marker = Marker( - markerId: markerId, - position: position - ); - _markers.clear(); - _markers.add(marker); -} - - - moveToPosition(LatLng latLng) async { - GoogleMapController mapController = await _googleMapController.future; - mapController.animateCamera( - CameraUpdate.newCameraPosition( - CameraPosition( - target: latLng, - zoom: 15 - ) - ) - ); - } - @override Widget build(BuildContext context) { - return Scaffold( - body: _buildBody(), - ); - } - - Widget _buildBody() { - return _getMap(); - } - - Widget _getMarker() { - return Container( - width: 25, - height: 25, - padding: EdgeInsets.all(2), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(100), - boxShadow: [ - BoxShadow( - color: Colors.grey, - offset: Offset(0,3), - spreadRadius: 4, - blurRadius: 6 - ) - ] - ), - child: ClipOval(child: Image.asset("assets/img/u1.png")), - ); - } - - Widget _getMap() { - return Stack( - children: [ - GoogleMap( - initialCameraPosition: _cameraPosition!, - mapType: MapType.normal, - onMapCreated: (GoogleMapController controller) { - if (!_googleMapController.isCompleted) { - _googleMapController.complete(controller); - } - }, - polylines: _polylines, - markers: _markers, - ), - Positioned.fill( - child: Align( - alignment: Alignment.center, - child: _getMarker() + return context.watch().listActivity.isEmpty + ? ScreenTypeLayout.builder( + mobile: (_) => const ProfileView(), + desktop: (_) => const ProfileView(), ) - ) - ], - ); + : ScreenTypeLayout.builder( + mobile: (_) => const MobileMyMaps(), + desktop: (_) => const WebMyMaps(), + ); } } diff --git a/lib/view/map/web/web_my_map.dart b/lib/view/map/web/web_my_map.dart new file mode 100644 index 0000000..6c4517a --- /dev/null +++ b/lib/view/map/web/web_my_map.dart @@ -0,0 +1,47 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/modele/utile/maps/maps_utile.dart'; + +class WebMyMaps extends StatefulWidget { + const WebMyMaps({super.key}); + + @override + State createState() => _WebMyMaps(); +} + +class _WebMyMaps extends State { + final Completer _googleMapController = Completer(); + CameraPosition? _cameraPosition; + Set _polylines = {}; + + @override + Widget build(BuildContext context) { + _polylines = MapUtil().initPolines(context, 10, TColor.primaryColor1); + _cameraPosition = + CameraPosition(target: _polylines.first.points.first, zoom: 18); + + return Scaffold( + body: _getMap(), + ); + } + + Widget _getMap() { + return Stack( + children: [ + GoogleMap( + initialCameraPosition: _cameraPosition!, + mapType: MapType.normal, + onMapCreated: (GoogleMapController controller) { + if (!_googleMapController.isCompleted) { + _googleMapController.complete(controller); + } + }, + polylines: _polylines, + ) + ], + ); + } +} diff --git a/lib/view/ne_pas_supprimer/map.txt b/lib/view/ne_pas_supprimer/map.txt new file mode 100644 index 0000000..c1e6fa5 --- /dev/null +++ b/lib/view/ne_pas_supprimer/map.txt @@ -0,0 +1,131 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:location/location.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; + +class MobileMyMaps extends StatefulWidget { + const MobileMyMaps({super.key}); + + @override + State createState() => _MobileMyMaps(); +} + +class _MobileMyMaps extends State { + Completer _googleMapController = Completer(); + CameraPosition? _cameraPosition; + Location? _location; + LocationData? _currentLocation; + List _polylineCoordinates = []; + Set _polylines = {}; + Set _markers = {}; // Add a set to store markers + + @override + void initState() { + _init(); + super.initState(); + } + + _init() async { + _location = Location(); + _cameraPosition = const CameraPosition( + target: LatLng( + 0, 0), // this is just the example lat and lng for initializing + zoom: 20); + _initLocation(); + } + + //function to listen when we move position + _initLocation() { + _location?.getLocation().then((location) { + _currentLocation = location; + }); + + _location?.onLocationChanged.listen((newLocation) { + setState(() { + _currentLocation = newLocation; + _polylineCoordinates.add(LatLng( + _currentLocation?.latitude ?? 0, + _currentLocation?.longitude ?? 0, + )); + _updatePolyline(); + }); + + moveToPosition(LatLng( + _currentLocation?.latitude ?? 0, _currentLocation?.longitude ?? 0)); + }); + } + + _updatePolyline() { + setState(() { + _polylines.clear(); + _polylines.add(Polyline( + polylineId: PolylineId("polyline"), + color: TColor.primaryColor1, + points: _polylineCoordinates, + width: 10, + )); + }); + } + + /* + // Updated _updateMarker to use the custom marker + _updateMarker(LatLng position) async { + final markerId = MarkerId('marker'); + final marker = Marker(markerId: markerId, position: position); + _markers.clear(); + _markers.add(marker); + }*/ + + moveToPosition(LatLng latLng) async { + GoogleMapController mapController = await _googleMapController.future; + mapController.animateCamera(CameraUpdate.newCameraPosition( + CameraPosition(target: latLng, zoom: 15))); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: _getMap(), + ); + } + + Widget _getMarker() { + return Container( + width: 25, + height: 25, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(100), + boxShadow: [ + BoxShadow( + color: Colors.grey, + offset: Offset(0, 3), + spreadRadius: 4, + blurRadius: 6) + ]), + child: ClipOval(child: Image.asset("assets/img/u1.png")), + ); + } + + Widget _getMap() { + return Stack( + children: [ + GoogleMap( + initialCameraPosition: _cameraPosition!, + mapType: MapType.normal, + onMapCreated: (GoogleMapController controller) { + if (!_googleMapController.isCompleted) { + _googleMapController.complete(controller); + } + }, + polylines: _polylines, + markers: _markers, + ), + Positioned.fill( + child: Align(alignment: Alignment.center, child: _getMarker())) + ], + ); + } +} diff --git a/web/index.html b/web/index.html index 04a3091..ac02418 100644 --- a/web/index.html +++ b/web/index.html @@ -26,6 +26,9 @@ + + +