mirror of
https://github.com/Iconica-Development/flutter_google_track_and_trace.git
synced 2025-05-19 13:13:44 +02:00
add Strong Map Styling
This commit is contained in:
parent
54fa43ebbf
commit
b9a867eaca
6 changed files with 161 additions and 70 deletions
|
@ -137,7 +137,7 @@ linter:
|
||||||
prefer_equal_for_default_values: true
|
prefer_equal_for_default_values: true
|
||||||
prefer_expression_function_bodies: false
|
prefer_expression_function_bodies: false
|
||||||
prefer_final_fields: true
|
prefer_final_fields: true
|
||||||
prefer_final_in_for_each: true
|
prefer_final_in_for_each: false
|
||||||
prefer_final_locals: false
|
prefer_final_locals: false
|
||||||
prefer_final_parameters: false
|
prefer_final_parameters: false
|
||||||
prefer_for_elements_to_map_fromIterable: true
|
prefer_for_elements_to_map_fromIterable: true
|
||||||
|
|
|
@ -137,7 +137,7 @@ linter:
|
||||||
prefer_equal_for_default_values: true
|
prefer_equal_for_default_values: true
|
||||||
prefer_expression_function_bodies: false
|
prefer_expression_function_bodies: false
|
||||||
prefer_final_fields: true
|
prefer_final_fields: true
|
||||||
prefer_final_in_for_each: true
|
prefer_final_in_for_each: false
|
||||||
prefer_final_locals: false
|
prefer_final_locals: false
|
||||||
prefer_final_parameters: false
|
prefer_final_parameters: false
|
||||||
prefer_for_elements_to_map_fromIterable: true
|
prefer_for_elements_to_map_fromIterable: true
|
||||||
|
|
|
@ -34,6 +34,22 @@ class _TrackTraceDemoState extends State<TrackTraceDemo> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
body: GoogleTrackTraceMap(
|
body: GoogleTrackTraceMap(
|
||||||
|
mapStylingTheme: GoogleTrackTraceMapTheme(
|
||||||
|
themes: [
|
||||||
|
GoogleMapThemeFeature(
|
||||||
|
featureType: 'poi',
|
||||||
|
stylers: [
|
||||||
|
{'visibility': 'off'},
|
||||||
|
],
|
||||||
|
),
|
||||||
|
GoogleMapThemeFeature(
|
||||||
|
featureType: 'transit',
|
||||||
|
stylers: [
|
||||||
|
{'visibility': 'off'},
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
startPosition: const Marker(
|
startPosition: const Marker(
|
||||||
markerId: MarkerId('Start locatie'),
|
markerId: MarkerId('Start locatie'),
|
||||||
position: LatLng(52.356057, 4.897540),
|
position: LatLng(52.356057, 4.897540),
|
||||||
|
@ -43,15 +59,15 @@ class _TrackTraceDemoState extends State<TrackTraceDemo> {
|
||||||
position: LatLng(52.364709, 4.877157),
|
position: LatLng(52.364709, 4.877157),
|
||||||
),
|
),
|
||||||
googleAPIKey: 'AIzaSyDaxZX8TeQeVf5tW-D6A66WLl20arbWV6c',
|
googleAPIKey: 'AIzaSyDaxZX8TeQeVf5tW-D6A66WLl20arbWV6c',
|
||||||
travelMode: TravelMode.bicycling,
|
travelMode: TravelMode.walking,
|
||||||
mapType: MapType.satellite,
|
mapType: MapType.normal,
|
||||||
routeUpdateInterval: 60,
|
routeUpdateInterval: 60,
|
||||||
timerPrecision: TimePrecision.everySecond,
|
timerPrecision: TimePrecision.everySecond,
|
||||||
zoomGesturesEnabled: true,
|
zoomGesturesEnabled: true,
|
||||||
line: const Polyline(
|
line: const Polyline(
|
||||||
polylineId: PolylineId('test route'),
|
polylineId: PolylineId('test route'),
|
||||||
color: Colors.purple,
|
color: Color(0xFFFF7884),
|
||||||
width: 5,
|
width: 3,
|
||||||
),
|
),
|
||||||
onMapCreated: (ctr) => {
|
onMapCreated: (ctr) => {
|
||||||
controller = ctr,
|
controller = ctr,
|
||||||
|
|
|
@ -17,3 +17,4 @@ export 'package:google_maps_flutter/google_maps_flutter.dart'
|
||||||
part 'src/controller.dart';
|
part 'src/controller.dart';
|
||||||
part 'src/directions_repository.dart';
|
part 'src/directions_repository.dart';
|
||||||
part 'src/google_map.dart';
|
part 'src/google_map.dart';
|
||||||
|
part 'src/google_map_theme.dart';
|
||||||
|
|
|
@ -19,8 +19,7 @@ class GoogleTrackTraceMap extends StatefulWidget {
|
||||||
this.mapToolbarEnabled = false,
|
this.mapToolbarEnabled = false,
|
||||||
this.mapType = MapType.normal,
|
this.mapType = MapType.normal,
|
||||||
this.buildingsEnabled = false,
|
this.buildingsEnabled = false,
|
||||||
this.mapMarkations =
|
this.mapStylingTheme,
|
||||||
'[{"featureType": "poi","stylers": [{"visibility": "off"}]}]',
|
|
||||||
this.line,
|
this.line,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@ -47,8 +46,7 @@ class GoogleTrackTraceMap extends StatefulWidget {
|
||||||
final bool mapToolbarEnabled;
|
final bool mapToolbarEnabled;
|
||||||
final bool buildingsEnabled;
|
final bool buildingsEnabled;
|
||||||
final MapType mapType;
|
final MapType mapType;
|
||||||
|
final GoogleTrackTraceMapTheme? mapStylingTheme;
|
||||||
final String mapMarkations;
|
|
||||||
|
|
||||||
final String googleAPIKey;
|
final String googleAPIKey;
|
||||||
|
|
||||||
|
@ -82,7 +80,9 @@ class _GoogleTrackTraceMapState extends State<GoogleTrackTraceMap> {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return GoogleMap(
|
return GoogleMap(
|
||||||
initialCameraPosition: calculateCameraPosition(
|
initialCameraPosition: calculateCameraPosition(
|
||||||
controller.start.position, controller.end.position,),
|
controller.start.position,
|
||||||
|
controller.end.position,
|
||||||
|
),
|
||||||
onMapCreated: _onMapCreated,
|
onMapCreated: _onMapCreated,
|
||||||
compassEnabled: widget.compassEnabled,
|
compassEnabled: widget.compassEnabled,
|
||||||
zoomControlsEnabled: widget.zoomControlsEnabled,
|
zoomControlsEnabled: widget.zoomControlsEnabled,
|
||||||
|
@ -100,7 +100,8 @@ class _GoogleTrackTraceMapState extends State<GoogleTrackTraceMap> {
|
||||||
? widget.line!.copyWith(
|
? widget.line!.copyWith(
|
||||||
pointsParam: controller.route!.line
|
pointsParam: controller.route!.line
|
||||||
.map((PointLatLng e) => LatLng(e.latitude, e.longitude))
|
.map((PointLatLng e) => LatLng(e.latitude, e.longitude))
|
||||||
.toList(),)
|
.toList(),
|
||||||
|
)
|
||||||
: Polyline(
|
: Polyline(
|
||||||
// default PolyLine if none is provided
|
// default PolyLine if none is provided
|
||||||
polylineId: const PolylineId('track&trace route'),
|
polylineId: const PolylineId('track&trace route'),
|
||||||
|
@ -110,7 +111,8 @@ class _GoogleTrackTraceMapState extends State<GoogleTrackTraceMap> {
|
||||||
.map((PointLatLng e) => LatLng(e.latitude, e.longitude))
|
.map((PointLatLng e) => LatLng(e.latitude, e.longitude))
|
||||||
.toList(),
|
.toList(),
|
||||||
),
|
),
|
||||||
},);
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onChange() {
|
void _onChange() {
|
||||||
|
@ -120,7 +122,14 @@ class _GoogleTrackTraceMapState extends State<GoogleTrackTraceMap> {
|
||||||
void _onMapCreated(GoogleMapController ctr) {
|
void _onMapCreated(GoogleMapController ctr) {
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
controller.mapController = ctr;
|
controller.mapController = ctr;
|
||||||
ctr.setMapStyle(widget.mapMarkations); // move to dart json file
|
if (widget.mapStylingTheme != null) {
|
||||||
|
ctr.setMapStyle(widget.mapStylingTheme!.getJson());
|
||||||
|
} else {
|
||||||
|
// No theme provided so switching to default
|
||||||
|
ctr.setMapStyle(
|
||||||
|
'[{"featureType": "poi","stylers": [{"visibility": "off"}]}]',
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,7 +159,8 @@ class _GoogleTrackTraceMapState extends State<GoogleTrackTraceMap> {
|
||||||
max(pointA.longitude, pointB.longitude),
|
max(pointA.longitude, pointB.longitude),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
50,);
|
50,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void startRouteUpdateTimer() {
|
void startRouteUpdateTimer() {
|
||||||
|
@ -170,7 +180,8 @@ class _GoogleTrackTraceMapState extends State<GoogleTrackTraceMap> {
|
||||||
controller.route = TrackTraceRoute(
|
controller.route = TrackTraceRoute(
|
||||||
controller.route!.duration - updateInterval,
|
controller.route!.duration - updateInterval,
|
||||||
controller.route!.distance,
|
controller.route!.distance,
|
||||||
controller.route!.line,);
|
controller.route!.line,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -184,17 +195,26 @@ class _GoogleTrackTraceMapState extends State<GoogleTrackTraceMap> {
|
||||||
mode: widget.travelMode,
|
mode: widget.travelMode,
|
||||||
key: widget.googleAPIKey,
|
key: widget.googleAPIKey,
|
||||||
)
|
)
|
||||||
.then((value) => {
|
.then(
|
||||||
controller.route = TrackTraceRoute(value.totalDuration,
|
(value) => {
|
||||||
value.totalDistance, value.polylinePoints,),
|
controller.route = TrackTraceRoute(
|
||||||
|
value.totalDuration,
|
||||||
|
value.totalDistance,
|
||||||
|
value.polylinePoints,
|
||||||
|
),
|
||||||
if (controller.mapController != null)
|
if (controller.mapController != null)
|
||||||
{
|
{
|
||||||
controller.mapController!.moveCamera(moveCameraToCenter(
|
controller.mapController!.moveCamera(
|
||||||
controller.start.position, controller.end.position,),),
|
moveCameraToCenter(
|
||||||
|
controller.start.position,
|
||||||
|
controller.end.position,
|
||||||
|
),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
setState(() {
|
setState(() {
|
||||||
lastRouteUpdate = DateTime.now();
|
lastRouteUpdate = DateTime.now();
|
||||||
})
|
})
|
||||||
},);
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
54
lib/src/google_map_theme.dart
Normal file
54
lib/src/google_map_theme.dart
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
part of google_track_trace;
|
||||||
|
|
||||||
|
/// Styling object for the Google maps Style
|
||||||
|
///
|
||||||
|
/// Contains a List of features with stylers applied to them
|
||||||
|
/// Full documentation on all the possible style:
|
||||||
|
/// https://developers.google.com/maps/documentation/javascript/style-reference
|
||||||
|
/// ```dart
|
||||||
|
/// GoogleTrackTraceMapTheme(
|
||||||
|
/// themes: [
|
||||||
|
/// GoogleMapThemeFeature(
|
||||||
|
/// featureType: 'poi',
|
||||||
|
/// stylers: [
|
||||||
|
/// {'visibility': 'off'},
|
||||||
|
/// ],
|
||||||
|
/// ),
|
||||||
|
/// ],
|
||||||
|
/// ),
|
||||||
|
/// ```
|
||||||
|
class GoogleTrackTraceMapTheme {
|
||||||
|
GoogleTrackTraceMapTheme({
|
||||||
|
required this.themes,
|
||||||
|
});
|
||||||
|
final List<GoogleMapThemeFeature> themes;
|
||||||
|
|
||||||
|
String getJson() {
|
||||||
|
var sb = StringBuffer('[');
|
||||||
|
for (var property in themes) {
|
||||||
|
sb..write(jsonEncode(property.toJson()))
|
||||||
|
..write(',');
|
||||||
|
}
|
||||||
|
sb.write(']');
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class GoogleMapThemeFeature {
|
||||||
|
GoogleMapThemeFeature({
|
||||||
|
required this.stylers,
|
||||||
|
this.featureType,
|
||||||
|
this.elementType,
|
||||||
|
});
|
||||||
|
final String? featureType;
|
||||||
|
final String? elementType;
|
||||||
|
final List<Map<String, String>> stylers;
|
||||||
|
|
||||||
|
Map toJson() {
|
||||||
|
return {
|
||||||
|
if(featureType != null) 'featureType': featureType,
|
||||||
|
if(elementType != null) 'elementType': elementType,
|
||||||
|
'stylers': stylers,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue