Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions packages/google_maps_flutter/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## 0.3.0

* **Breaking change**. Changed the Marker API to be
widget based, it was controller based. Also changed the
example app to account for the same.

## 0.2.0+6

* Updated the sample app in README.md.
Expand Down
227 changes: 133 additions & 94 deletions packages/google_maps_flutter/example/lib/place_marker.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,142 +25,191 @@ class PlaceMarkerBody extends StatefulWidget {
State<StatefulWidget> createState() => PlaceMarkerBodyState();
}

typedef Marker MarkerUpdateAction(Marker marker);

class PlaceMarkerBodyState extends State<PlaceMarkerBody> {
PlaceMarkerBodyState();

static final LatLng center = const LatLng(-33.86711, 151.1947171);

GoogleMapController controller;
int _markerCount = 0;
Marker _selectedMarker;
Map<MarkerId, Marker> markers = <MarkerId, Marker>{};
MarkerId selectedMarker;
int _markerIdCounter = 1;

void _onMapCreated(GoogleMapController controller) {
this.controller = controller;
controller.onMarkerTapped.add(_onMarkerTapped);
}

@override
void dispose() {
controller?.onMarkerTapped?.remove(_onMarkerTapped);
super.dispose();
}

void _onMarkerTapped(Marker marker) {
if (_selectedMarker != null) {
_updateSelectedMarker(
const MarkerOptions(icon: BitmapDescriptor.defaultMarker),
);
void _onMarkerTapped(MarkerId markerId) {
final Marker tappedMarker = markers[markerId];
if (tappedMarker != null) {
setState(() {
if (markers.containsKey(selectedMarker)) {
final Marker resetOld = markers[selectedMarker]
.copyWith(iconParam: BitmapDescriptor.defaultMarker);
markers[selectedMarker] = resetOld;
}
selectedMarker = markerId;
final Marker newMarker = tappedMarker.copyWith(
iconParam: BitmapDescriptor.defaultMarkerWithHue(
BitmapDescriptor.hueGreen,
),
);
markers[markerId] = newMarker;
});
}
setState(() {
_selectedMarker = marker;
});
_updateSelectedMarker(
MarkerOptions(
icon: BitmapDescriptor.defaultMarkerWithHue(
BitmapDescriptor.hueGreen,
),
),
);
}

void _updateSelectedMarker(MarkerOptions changes) {
controller.updateMarker(_selectedMarker, changes);
}

void _add() {
controller.addMarker(MarkerOptions(
final int markerCount = markers.length;

if (markerCount == 12) {
return;
}

final String markerIdVal = 'marker_id_$_markerIdCounter';
_markerIdCounter++;
final MarkerId markerId = MarkerId(markerIdVal);

final Marker marker = Marker(
markerId: markerId,
position: LatLng(
center.latitude + sin(_markerCount * pi / 6.0) / 20.0,
center.longitude + cos(_markerCount * pi / 6.0) / 20.0,
center.latitude + sin(_markerIdCounter * pi / 6.0) / 20.0,
center.longitude + cos(_markerIdCounter * pi / 6.0) / 20.0,
),
infoWindowText: InfoWindowText('Marker #${_markerCount + 1}', '*'),
));
infoWindow: InfoWindow(title: markerIdVal, snippet: '*'),
onTap: () {
_onMarkerTapped(markerId);
},
);

setState(() {
_markerCount += 1;
markers[markerId] = marker;
});
}

void _remove() {
controller.removeMarker(_selectedMarker);
setState(() {
_selectedMarker = null;
_markerCount -= 1;
if (markers.containsKey(selectedMarker)) {
markers.remove(selectedMarker);
}
});
}

void _changePosition() {
final LatLng current = _selectedMarker.options.position;
final Marker marker = markers[selectedMarker];
final LatLng current = marker.position;
final Offset offset = Offset(
center.latitude - current.latitude,
center.longitude - current.longitude,
);
_updateSelectedMarker(
MarkerOptions(
position: LatLng(
setState(() {
markers[selectedMarker] = marker.copyWith(
positionParam: LatLng(
center.latitude + offset.dy,
center.longitude + offset.dx,
),
),
);
);
});
}

void _changeAnchor() {
final Offset currentAnchor = _selectedMarker.options.anchor;
final Marker marker = markers[selectedMarker];
final Offset currentAnchor = marker.anchor;
final Offset newAnchor = Offset(1.0 - currentAnchor.dy, currentAnchor.dx);
_updateSelectedMarker(MarkerOptions(anchor: newAnchor));
setState(() {
markers[selectedMarker] = marker.copyWith(
anchorParam: newAnchor,
);
});
}

Future<void> _changeInfoAnchor() async {
final Offset currentAnchor = _selectedMarker.options.infoWindowAnchor;
final Marker marker = markers[selectedMarker];
final Offset currentAnchor = marker.infoWindow.anchor;
final Offset newAnchor = Offset(1.0 - currentAnchor.dy, currentAnchor.dx);
_updateSelectedMarker(MarkerOptions(infoWindowAnchor: newAnchor));
setState(() {
markers[selectedMarker] = marker.copyWith(
infoWindowParam: marker.infoWindow.copyWith(
anchorParam: newAnchor,
),
);
});
}

Future<void> _toggleDraggable() async {
_updateSelectedMarker(
MarkerOptions(draggable: !_selectedMarker.options.draggable),
);
final Marker marker = markers[selectedMarker];
setState(() {
markers[selectedMarker] = marker.copyWith(
draggableParam: !marker.draggable,
);
});
}

Future<void> _toggleFlat() async {
_updateSelectedMarker(MarkerOptions(flat: !_selectedMarker.options.flat));
final Marker marker = markers[selectedMarker];
setState(() {
markers[selectedMarker] = marker.copyWith(
flatParam: !marker.flat,
);
});
}

Future<void> _changeInfo() async {
final InfoWindowText currentInfo = _selectedMarker.options.infoWindowText;
_updateSelectedMarker(MarkerOptions(
infoWindowText: InfoWindowText(
currentInfo.title,
currentInfo.snippet + '*',
),
));
final Marker marker = markers[selectedMarker];
final String newSnippet = marker.infoWindow.snippet + '*';
setState(() {
markers[selectedMarker] = marker.copyWith(
infoWindowParam: marker.infoWindow.copyWith(
snippetParam: newSnippet,
),
);
});
}

Future<void> _changeAlpha() async {
final double current = _selectedMarker.options.alpha;
_updateSelectedMarker(
MarkerOptions(alpha: current < 0.1 ? 1.0 : current * 0.75),
);
final Marker marker = markers[selectedMarker];
final double current = marker.alpha;
setState(() {
markers[selectedMarker] = marker.copyWith(
alphaParam: current < 0.1 ? 1.0 : current * 0.75,
);
});
}

Future<void> _changeRotation() async {
final double current = _selectedMarker.options.rotation;
_updateSelectedMarker(
MarkerOptions(rotation: current == 330.0 ? 0.0 : current + 30.0),
);
final Marker marker = markers[selectedMarker];
final double current = marker.rotation;
setState(() {
markers[selectedMarker] = marker.copyWith(
rotationParam: current == 330.0 ? 0.0 : current + 30.0,
);
});
}

Future<void> _toggleVisible() async {
_updateSelectedMarker(
MarkerOptions(visible: !_selectedMarker.options.visible),
);
final Marker marker = markers[selectedMarker];
setState(() {
markers[selectedMarker] = marker.copyWith(
visibleParam: !marker.visible,
);
});
}

Future<void> _changeZIndex() async {
final double current = _selectedMarker.options.zIndex;
_updateSelectedMarker(
MarkerOptions(zIndex: current == 12.0 ? 0.0 : current + 1.0),
);
final Marker marker = markers[selectedMarker];
final double current = marker.zIndex;
setState(() {
markers[selectedMarker] = marker.copyWith(
zIndexParam: current == 12.0 ? 0.0 : current + 1.0,
);
});
}

@override
Expand All @@ -179,6 +228,10 @@ class PlaceMarkerBodyState extends State<PlaceMarkerBody> {
target: LatLng(-33.852, 151.211),
zoom: 11.0,
),
// TODO(iskakaushik): Remove this when collection literals makes it to stable.
// https://github.com/flutter/flutter/issues/28312
// ignore: prefer_collection_literals
markers: Set<Marker>.of(markers.values),
),
),
),
Expand All @@ -193,69 +246,55 @@ class PlaceMarkerBodyState extends State<PlaceMarkerBody> {
children: <Widget>[
FlatButton(
child: const Text('add'),
onPressed: (_markerCount == 12) ? null : _add,
onPressed: _add,
),
FlatButton(
child: const Text('remove'),
onPressed: (_selectedMarker == null) ? null : _remove,
onPressed: _remove,
),
FlatButton(
child: const Text('change info'),
onPressed:
(_selectedMarker == null) ? null : _changeInfo,
onPressed: _changeInfo,
),
FlatButton(
child: const Text('change info anchor'),
onPressed: (_selectedMarker == null)
? null
: _changeInfoAnchor,
onPressed: _changeInfoAnchor,
),
],
),
Column(
children: <Widget>[
FlatButton(
child: const Text('change alpha'),
onPressed:
(_selectedMarker == null) ? null : _changeAlpha,
onPressed: _changeAlpha,
),
FlatButton(
child: const Text('change anchor'),
onPressed:
(_selectedMarker == null) ? null : _changeAnchor,
onPressed: _changeAnchor,
),
FlatButton(
child: const Text('toggle draggable'),
onPressed: (_selectedMarker == null)
? null
: _toggleDraggable,
onPressed: _toggleDraggable,
),
FlatButton(
child: const Text('toggle flat'),
onPressed:
(_selectedMarker == null) ? null : _toggleFlat,
onPressed: _toggleFlat,
),
FlatButton(
child: const Text('change position'),
onPressed: (_selectedMarker == null)
? null
: _changePosition,
onPressed: _changePosition,
),
FlatButton(
child: const Text('change rotation'),
onPressed: (_selectedMarker == null)
? null
: _changeRotation,
onPressed: _changeRotation,
),
FlatButton(
child: const Text('toggle visible'),
onPressed:
(_selectedMarker == null) ? null : _toggleVisible,
onPressed: _toggleVisible,
),
FlatButton(
child: const Text('change zIndex'),
onPressed:
(_selectedMarker == null) ? null : _changeZIndex,
onPressed: _changeZIndex,
),
],
),
Expand Down
Loading