Я пытаюсь переключаться между добавлением и удалением полигонов на Картах Google. Я успешно это делаю, но только на Android. Приложение на iOS не перестраивается напрямую, и мне приходится взаимодействовать с другим элементом приложения (панелью поиска), чтобы оно перестраивалось.
Я использую провайдер для управления состоянием, а с ним я ' переключение между очисткой и добавлением полигонов. Код из виджета карт Google выглядит следующим образом:
Виджет карт
class MapWidget extends StatefulWidget {
@override
_MapWidgetState createState() => _MapWidgetState();
}
class _MapWidgetState extends State<MapWidget> {
Completer<GoogleMapController> _completer;
CampusPolygons _polygon;
LatLng _currentLocation;
CameraPosition _initialCameraLocation;
StreamSubscription _locationSubscription;
Location _location = new Location();
String error;
@override
void initState() {
super.initState();
SizeConfig();
//*****UNCOMMENT BELLOW FOR DARK MAP*****
//*****MIGHT IMPLEMENT AUTOMATIC DARK MODE*****
// rootBundle.loadString('assets/map_style.txt').then((string) {
// _mapStyle = string;
// });
initPlatformState();
_locationSubscription =
_location.onLocationChanged().listen((newLocalData) {
setState(() {
_currentLocation =
LatLng(newLocalData.latitude, newLocalData.longitude);
_initialCameraLocation = CameraPosition(
target: _currentLocation,
zoom: CAMERA_ZOOM,
tilt: CAMERA_TILT,
bearing: CAMERA_BEARING,
);
});
});
}
@override
void dispose() {
if (_locationSubscription != null) {
_locationSubscription.cancel();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
SizeConfig().init(context);
_completer = Provider.of<MapData>(context).getCompleter;
_polygon = Provider.of<MapData>(context).getPolygon;
while (_initialCameraLocation == null) {
return Center(child: Text("Loading Map"));
}
return Stack(
children: <Widget>[
GoogleMap(
myLocationEnabled: true,
myLocationButtonEnabled: false,
compassEnabled: false,
tiltGesturesEnabled: true,
buildingsEnabled: false,
mapType: MapType.normal,
polygons: _polygon.allPolygons,
indoorViewEnabled: false,
trafficEnabled: false,
initialCameraPosition: _initialCameraLocation,
onMapCreated: (controller) async {
_completer.complete(controller);
// controller.setMapStyle(_mapStyle);
}),
SafeArea(
child: Padding(
padding: EdgeInsets.only(
top: SizeConfig.safeBlockVertical * 66,
left: SizeConfig.safeBlockHorizontal * 83,
),
child: FloatingActionButton(
onPressed: () {
_campus
? () {
Provider.of<MapData>(context, listen: false)
.animateTo(SGW.latitude, SGW.longitude);
_campus = false;
}()
: () {
Provider.of<MapData>(context, listen: false)
.animateTo(LOYOLA.latitude, LOYOLA.longitude);
_campus = true;
}();
},
child: Icon(Icons.swap_calls),
backgroundColor: Color(0xFFFFFFF8),
foregroundColor: Color(0xFF656363),
elevation: 5.0,
heroTag: null,
),
),
),
SafeArea(
child: Padding(
padding: EdgeInsets.only(
top: SizeConfig.safeBlockVertical * 75,
left: SizeConfig.safeBlockHorizontal * 83,
),
child: FloatingActionButton(
onPressed: () {
Provider.of<MapData>(context, listen: false).animateTo(
_currentLocation.latitude, _currentLocation.longitude);
},
child: Icon(Icons.gps_fixed),
backgroundColor: Color(0xFFFFFFF8),
foregroundColor: Color(0xFF656363),
elevation: 5.0,
heroTag: null,
),
),
),
],
);
}
initPlatformState() async {
LocationData myLocation;
try {
myLocation = await _location.getLocation();
error = "";
} on PlatformException catch (e) {
if (e.code == 'PERMISSION_DENIED') {
debugPrint("Permission Denied");
myLocation = null;
}
}
setState(() {
_currentLocation = LatLng(myLocation.latitude, myLocation.longitude);
_initialCameraLocation = CameraPosition(
target: _currentLocation,
zoom: CAMERA_ZOOM,
tilt: CAMERA_TILT,
bearing: CAMERA_BEARING,
);
});
}
}
Кнопка переключения
class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
@override
Widget build(BuildContext context) {
CampusPolygons _polygon = Provider.of<MapData>(context).getPolygon;
return AppBar(
backgroundColor: Color(0xFF73C700),
title: Text("ConNavigation"),
actions: <Widget>[
IconButton(
icon: Icon(Icons.wb_sunny),
onPressed: () {
if (_polygon.allPolygons.isEmpty) {
_polygon.addPolygons();
} else {
_polygon.clearPolygons();
}
},
),
IconButton(
icon: Icon(Icons.search),
onPressed: () {
showSearch(context: context, delegate: LocationSearch());
},
)
],
);
}
@override
Size get preferredSize => Size.fromHeight(kToolbarHeight);
}
Как бы я принудительно восстановить?