Skip to content

Commit

Permalink
[google_maps_flutter_web] Allow marker position updates (flutter#3697)
Browse files Browse the repository at this point in the history
Unconditionally convert the current marker position in `convert.dart:_markerOptionsFromMarker`, to allow for position updates.

Also adds position changes to `marker_test.dart/MarkerController/update` and `markers_test.dart/MarkersController/changeMarkers`. The `MarkersController` case is fixed by this patch.

* Grafted from: flutter/plugins#6753
* Fixes: flutter/flutter#83467
  • Loading branch information
AsturaPhoenix authored and nploi committed Jul 16, 2023
1 parent 91c1c8f commit b08dbaa
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
## 0.4.1

* Add "My Location" Widget. Issue [#64073](https://github.com/flutter/flutter/issues/64073)

## 0.4.0+8

* Updates minimum Flutter version to 3.3.
* Allows marker position updates. Issue [#83467](https://github.com/flutter/flutter/issues/83467).

## 0.4.0+7

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,16 @@ void main() {
testWidgets('update', (WidgetTester tester) async {
final MarkerController controller = MarkerController(marker: marker);
final gmaps.MarkerOptions options = gmaps.MarkerOptions()
..draggable = true;
..draggable = true
..position = gmaps.LatLng(42, 54);

expect(marker.draggable, isNull);

controller.update(options);

expect(marker.draggable, isTrue);
expect(marker.position?.lat, equals(42));
expect(marker.position?.lng, equals(54));
});

testWidgets('infoWindow null, showInfoWindow.',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,23 +47,86 @@ void main() {
});

testWidgets('changeMarkers', (WidgetTester tester) async {
gmaps.Marker? marker;
gmaps.LatLng? position;

final Set<Marker> markers = <Marker>{
const Marker(markerId: MarkerId('1')),
};
controller.addMarkers(markers);

expect(
controller.markers[const MarkerId('1')]?.marker?.draggable, isFalse);
marker = controller.markers[const MarkerId('1')]?.marker;
expect(marker, isNotNull);
expect(marker!.draggable, isFalse);

// Update the marker with radius 10
// By default, markers fall in LatLng(0, 0)
position = marker.position;
expect(position, isNotNull);
expect(position!.lat, equals(0));
expect(position.lng, equals(0));

// Update the marker with draggable and position
final Set<Marker> updatedMarkers = <Marker>{
const Marker(markerId: MarkerId('1'), draggable: true),
const Marker(
markerId: MarkerId('1'),
draggable: true,
position: LatLng(42, 54),
),
};
controller.changeMarkers(updatedMarkers);
expect(controller.markers.length, 1);

marker = controller.markers[const MarkerId('1')]?.marker;
expect(marker, isNotNull);
expect(marker!.draggable, isTrue);

position = marker.position;
expect(position, isNotNull);
expect(position!.lat, equals(42));
expect(position.lng, equals(54));
});

testWidgets(
'changeMarkers resets marker position if not passed when updating!',
(WidgetTester tester) async {
gmaps.Marker? marker;
gmaps.LatLng? position;

final Set<Marker> markers = <Marker>{
const Marker(
markerId: MarkerId('1'),
position: LatLng(42, 54),
),
};
controller.addMarkers(markers);

marker = controller.markers[const MarkerId('1')]?.marker;
expect(marker, isNotNull);
expect(marker!.draggable, isFalse);

position = marker.position;
expect(position, isNotNull);
expect(position!.lat, equals(42));
expect(position.lng, equals(54));

// Update the marker without position
final Set<Marker> updatedMarkers = <Marker>{
const Marker(
markerId: MarkerId('1'),
draggable: true,
),
};
controller.changeMarkers(updatedMarkers);
expect(controller.markers.length, 1);
expect(
controller.markers[const MarkerId('1')]?.marker?.draggable, isTrue);

marker = controller.markers[const MarkerId('1')]?.marker;
expect(marker, isNotNull);
expect(marker!.draggable, isTrue);

position = marker.position;
expect(position, isNotNull);
expect(position!.lat, equals(0));
expect(position.lng, equals(0));
});

testWidgets('removeMarkers', (WidgetTester tester) async {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ flutter pub get

echo "(Re)generating mocks."

flutter pub run build_runner build --delete-conflicting-outputs
dart run build_runner build --delete-conflicting-outputs
Original file line number Diff line number Diff line change
Expand Up @@ -290,17 +290,15 @@ gmaps.Icon? _gmIconFromBitmapDescriptor(BitmapDescriptor bitmapDescriptor) {

// Computes the options for a new [gmaps.Marker] from an incoming set of options
// [marker], and the existing marker registered with the map: [currentMarker].
// Preserves the position from the [currentMarker], if set.
gmaps.MarkerOptions _markerOptionsFromMarker(
Marker marker,
gmaps.Marker? currentMarker,
) {
return gmaps.MarkerOptions()
..position = currentMarker?.position ??
gmaps.LatLng(
marker.position.latitude,
marker.position.longitude,
)
..position = gmaps.LatLng(
marker.position.latitude,
marker.position.longitude,
)
..title = sanitizeHtml(marker.infoWindow.title ?? '')
..zIndex = marker.zIndex
..visible = marker.visible
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/google_maps_f
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22
version: 0.4.1


environment:
sdk: ">=2.18.0 <4.0.0"
flutter: ">=3.3.0"
Expand Down

0 comments on commit b08dbaa

Please sign in to comment.