I am having issues getting the Google Maps styling to work in my Flutter application on Android. I am using the google_maps_flutter
plugin version 0.5.30
. I got the styling JSON
from the Google Maps Styling wizard by suppressing all labels, roads and landmarks by setting the dial to the left extreme and took the JSON from that. I am loading that from an asset file in my widget's initState()
method and in the onMapCreated method am calling mapController.setMapStyle
with the loaded JSON. The call succeeds, but the map still shows the names of cities.
I have tried calling setState after the setMapStyle call as opposed to putting the setMapStyle() call inside setState(() {..}) but that didn't work either.
Following is a link to the Google Maps Styling wizard where the same JSON shows no cities or any labels. https://1drv.ms/u/s!AoeWKBC0aN0DhoA8qIr3SehO1o4UhQ
Following is a link to the screenshot from my Android Tablet where the app is deployed and it shows the map (with mapStyle using the same JSON
) but it shows cities and province names.
https://1drv.ms/u/s!AoeWKBC0aN0DhoA7MOALo0w7NWixuA?e=BKw9fu
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Google Maps',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Google MapsPage'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
GoogleMapController mapController;
String mapStyle;
// following are lat/long of Anantapur which is roughly at the
// center of South India
final LatLng center = const LatLng(14.68, 77.6);
double INITIAL_ZOOM=6.0;
@override
void initState() {
super.initState();
//loading map style JSON from asset file
DefaultAssetBundle.of(context).loadString('assets/googleMapStyle1.json').then((string) {
this.mapStyle = string;
}).catchError((error) {
log(error.toString());
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: Center(
// Center is a layout widget. It takes a single child and positions it
// in the middle of the parent.
child: Column(
children: <Widget>[
Expanded(
child: GoogleMap(
onMapCreated: mapCreated,
mapType: MapType.terrain,
initialCameraPosition: CameraPosition(
target: center,
zoom: INITIAL_ZOOM,
)
)
)
],
),
));
}
void mapCreated(GoogleMapController controller) {
//set style on the map on creation to customize look showing only map features
//we want to show.
log(this.mapStyle);
setState(() {
this.mapController = controller;
if (mapStyle != null) {
this.mapController.setMapStyle(this.mapStyle).
then((value) {
log("Map Style set");
}).catchError((error) =>
log("Error setting map style:" + error.toString()));
}
else {
log(
"GoogleMapView:_onMapCreated: Map style could not be loaded.");
}
});
}
}
The following is the JSON in assets/googleMapStyle1.json:
[
{
"elementType": "labels",
"stylers": [
{
"visibility": "off"
}
]
},
{
"featureType": "administrative",
"elementType": "geometry",
"stylers": [
{
"visibility": "off"
}
]
},
{
"featureType": "administrative.land_parcel",
"stylers": [
{
"visibility": "off"
}
]
},
{
"featureType": "administrative.neighborhood",
"stylers": [
{
"visibility": "off"
}
]
},
{
"featureType": "poi",
"stylers": [
{
"visibility": "off"
}
]
},
{
"featureType": "road",
"stylers": [
{
"visibility": "off"
}
]
},
{
"featureType": "road",
"elementType": "labels.icon",
"stylers": [
{
"visibility": "off"
}
]
},
{
"featureType": "transit",
"stylers": [
{
"visibility": "off"
}
]
}
]
Following is my pubspec.yaml:
name: googlemapsstyling
description: Google Maps Flutter styling issuue
# The following line prevents the package from being accidentally published to
# pub.dev using `pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1
environment:
sdk: ">=2.7.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
google_maps_flutter: ^0.5.30
cupertino_icons: ^0.1.3
dev_dependencies:
flutter_test:
sdk: flutter
# The following section is specific to Flutter.
flutter:
uses-material-design: true
# To add assets to your application, add an assets section, like this:
assets:
- assets/googleMapStyle1.json
Any pointers to what I am doing wrong or is this a bug?
After you described your custom map style, mapType: MapType.terrain,
override the custom theme in the GoogleMap
Widget.
The Updated Code is Below or just comment out or remove the maptype:
line.
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: Center(
// Center is a layout widget. It takes a single child and positions it
// in the middle of the parent.
child: Column(
children: <Widget>[
Expanded(
child: GoogleMap(
onMapCreated: mapCreated,
//mapType: MapType.terrain, //This was causing the problem
initialCameraPosition: CameraPosition(
target: center,
zoom: _initialZoom,
)
)
)
],
),
));
}