Skip to content

Commit 7cdcf30

Browse files
[google_maps_flutter_web] Migrate to package:web (#5254)
This PR migrates `google_maps_flutter_web` from `dart:html` to `package:web`. The `google_maps` package does provide a beta version with support for `package:web`, which is currently what this PR is depending on. Before landing this change, we should change the dependency to the stable release version of that package. Fixes flutter/flutter#137374 *If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].* N/A
1 parent 5ff00b2 commit 7cdcf30

19 files changed

+276
-88
lines changed

packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
## NEXT
1+
## 0.5.5
22

3-
* Updates minimum supported SDK version to Flutter 3.13/Dart 3.1.
3+
* Migrates to `dart:js_interop` and `package:web` APIs.
4+
* Updates minimum supported SDK version to Flutter 3.19/Dart 3.3.
45

56
## 0.5.4+3
67

packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart

+4-3
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
// found in the LICENSE file.
44

55
import 'dart:async';
6-
import 'dart:html' as html;
76

87
import 'package:flutter/widgets.dart';
98
import 'package:flutter_test/flutter_test.dart';
109
import 'package:google_maps/google_maps.dart' as gmaps;
1110
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';
1211
import 'package:google_maps_flutter_web/google_maps_flutter_web.dart';
12+
// ignore: implementation_imports
13+
import 'package:google_maps_flutter_web/src/utils.dart';
1314
import 'package:integration_test/integration_test.dart';
1415
import 'package:mockito/annotations.dart';
1516
import 'package:mockito/mockito.dart';
@@ -230,7 +231,7 @@ void main() {
230231
polygons = MockPolygonsController();
231232
polylines = MockPolylinesController();
232233
tileOverlays = MockTileOverlaysController();
233-
map = gmaps.GMap(html.DivElement());
234+
map = gmaps.GMap(createDivElement());
234235
});
235236

236237
testWidgets('listens to map events', (WidgetTester tester) async {
@@ -471,7 +472,7 @@ void main() {
471472

472473
setUp(() {
473474
map = gmaps.GMap(
474-
html.DivElement(),
475+
createDivElement(),
475476
gmaps.MapOptions()
476477
..zoom = 10
477478
..center = gmaps.LatLng(0, 0),

packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/marker_test.dart

+5-4
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
// found in the LICENSE file.
44

55
import 'dart:async';
6-
import 'dart:html' as html;
76

87
import 'package:flutter_test/flutter_test.dart';
98
import 'package:google_maps/google_maps.dart' as gmaps;
109
import 'package:google_maps_flutter_web/google_maps_flutter_web.dart';
10+
// ignore: implementation_imports
11+
import 'package:google_maps_flutter_web/src/utils.dart';
1112
import 'package:integration_test/integration_test.dart';
1213

1314
/// Test Markers
@@ -123,7 +124,7 @@ void main() {
123124

124125
testWidgets('showInfoWindow', (WidgetTester tester) async {
125126
final gmaps.InfoWindow infoWindow = gmaps.InfoWindow();
126-
final gmaps.GMap map = gmaps.GMap(html.DivElement());
127+
final gmaps.GMap map = gmaps.GMap(createDivElement());
127128
marker.set('map', map);
128129
final MarkerController controller = MarkerController(
129130
marker: marker,
@@ -138,7 +139,7 @@ void main() {
138139

139140
testWidgets('hideInfoWindow', (WidgetTester tester) async {
140141
final gmaps.InfoWindow infoWindow = gmaps.InfoWindow();
141-
final gmaps.GMap map = gmaps.GMap(html.DivElement());
142+
final gmaps.GMap map = gmaps.GMap(createDivElement());
142143
marker.set('map', map);
143144
final MarkerController controller = MarkerController(
144145
marker: marker,
@@ -156,7 +157,7 @@ void main() {
156157

157158
setUp(() {
158159
final gmaps.InfoWindow infoWindow = gmaps.InfoWindow();
159-
final gmaps.GMap map = gmaps.GMap(html.DivElement());
160+
final gmaps.GMap map = gmaps.GMap(createDivElement());
160161
marker.set('map', map);
161162
controller = MarkerController(marker: marker, infoWindow: infoWindow);
162163
});

packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/markers_test.dart

+10-8
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,18 @@
44

55
import 'dart:async';
66
import 'dart:convert';
7-
import 'dart:html' as html;
87
import 'dart:typed_data';
98
import 'dart:ui';
109

1110
import 'package:flutter_test/flutter_test.dart';
1211
import 'package:google_maps/google_maps.dart' as gmaps;
1312
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';
1413
import 'package:google_maps_flutter_web/google_maps_flutter_web.dart';
14+
// ignore: implementation_imports
15+
import 'package:google_maps_flutter_web/src/utils.dart';
1516
import 'package:http/http.dart' as http;
1617
import 'package:integration_test/integration_test.dart';
18+
import 'package:web/web.dart';
1719

1820
import 'resources/icon_image_base64.dart';
1921

@@ -28,7 +30,7 @@ void main() {
2830
setUp(() {
2931
events = StreamController<MapEvent<Object?>>();
3032
controller = MarkersController(stream: events);
31-
map = gmaps.GMap(html.DivElement());
33+
map = gmaps.GMap(createDivElement());
3234
controller.bindToMap(123, map);
3335
});
3436

@@ -274,11 +276,11 @@ void main() {
274276
controller.addMarkers(markers);
275277

276278
expect(controller.markers.length, 1);
277-
final html.HtmlElement? content = controller.markers[const MarkerId('1')]
278-
?.infoWindow?.content as html.HtmlElement?;
279-
expect(content?.innerHtml, contains('title for test'));
279+
final HTMLElement? content = controller
280+
.markers[const MarkerId('1')]?.infoWindow?.content as HTMLElement?;
281+
expect(content?.innerHTML, contains('title for test'));
280282
expect(
281-
content?.innerHtml,
283+
content?.innerHTML,
282284
contains(
283285
'<a href="https://www.google.com">Go to Google &gt;&gt;&gt;</a>',
284286
));
@@ -299,8 +301,8 @@ void main() {
299301
controller.addMarkers(markers);
300302

301303
expect(controller.markers.length, 1);
302-
final html.HtmlElement? content = controller.markers[const MarkerId('1')]
303-
?.infoWindow?.content as html.HtmlElement?;
304+
final HTMLElement? content = controller
305+
.markers[const MarkerId('1')]?.infoWindow?.content as HTMLElement?;
304306

305307
content?.click();
306308

packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/overlay_test.dart

+20-15
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
// found in the LICENSE file.
44

55
import 'dart:convert';
6-
import 'dart:html' as html;
6+
import 'dart:js_interop';
77

88
import 'package:flutter_test/flutter_test.dart';
99
import 'package:google_maps/google_maps.dart' as gmaps;
1010
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';
1111
import 'package:google_maps_flutter_web/google_maps_flutter_web.dart';
1212
import 'package:integration_test/integration_test.dart';
13+
import 'package:web/web.dart';
1314

1415
import 'resources/tile16_base64.dart';
1516

@@ -43,8 +44,10 @@ void main() {
4344
final gmaps.Size size = controller.gmMapType.tileSize!;
4445
expect(size.width, TileOverlayController.logicalTileSize);
4546
expect(size.height, TileOverlayController.logicalTileSize);
46-
expect(controller.gmMapType.getTile!(gmaps.Point(0, 0), 0, html.document),
47-
null);
47+
expect(
48+
controller.gmMapType.getTile!(gmaps.Point(0, 0), 0, document),
49+
null,
50+
);
4851
});
4952

5053
testWidgets('produces image tiles', (WidgetTester tester) async {
@@ -55,16 +58,16 @@ void main() {
5558
),
5659
);
5760

58-
final html.ImageElement img =
59-
controller.gmMapType.getTile!(gmaps.Point(0, 0), 0, html.document)!
60-
as html.ImageElement;
61+
final HTMLImageElement img =
62+
controller.gmMapType.getTile!(gmaps.Point(0, 0), 0, document)!
63+
as HTMLImageElement;
6164
expect(img.naturalWidth, 0);
6265
expect(img.naturalHeight, 0);
6366
expect(img.hidden, true);
6467

65-
// Wait until the image is fully loaded and decoded before re-reading its attributes.
6668
await img.onLoad.first;
67-
await img.decode();
69+
70+
await img.decode().toDart;
6871

6972
expect(img.hidden, false);
7073
expect(img.naturalWidth, 16);
@@ -79,9 +82,9 @@ void main() {
7982
),
8083
);
8184
{
82-
final html.ImageElement img =
83-
controller.gmMapType.getTile!(gmaps.Point(0, 0), 0, html.document)!
84-
as html.ImageElement;
85+
final HTMLImageElement img =
86+
controller.gmMapType.getTile!(gmaps.Point(0, 0), 0, document)!
87+
as HTMLImageElement;
8588
await null; // let `getTile` `then` complete
8689
expect(
8790
img.src,
@@ -95,10 +98,12 @@ void main() {
9598
tileProvider: TestTileProvider(),
9699
));
97100
{
98-
final html.ImageElement img =
99-
controller.gmMapType.getTile!(gmaps.Point(0, 0), 0, html.document)!
100-
as html.ImageElement;
101+
final HTMLImageElement img =
102+
controller.gmMapType.getTile!(gmaps.Point(0, 0), 0, document)!
103+
as HTMLImageElement;
104+
101105
await img.onLoad.first;
106+
102107
expect(
103108
img.src,
104109
isNotEmpty,
@@ -109,7 +114,7 @@ void main() {
109114
controller.update(const TileOverlay(tileOverlayId: id));
110115
{
111116
expect(
112-
controller.gmMapType.getTile!(gmaps.Point(0, 0), 0, html.document),
117+
controller.gmMapType.getTile!(gmaps.Point(0, 0), 0, document),
113118
null,
114119
reason: 'Setting a null tileProvider should work.',
115120
);

packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/overlays_test.dart

+5-3
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,19 @@
33
// found in the LICENSE file.
44

55
import 'dart:async';
6-
import 'dart:html' as html;
76

87
import 'package:flutter/material.dart';
98
import 'package:flutter_test/flutter_test.dart';
109
import 'package:google_maps/google_maps.dart' as gmaps;
1110
import 'package:google_maps_flutter/google_maps_flutter.dart';
1211
import 'package:google_maps_flutter_web/google_maps_flutter_web.dart'
1312
hide GoogleMapController;
13+
// ignore: implementation_imports
14+
import 'package:google_maps_flutter_web/src/utils.dart';
1415
import 'package:integration_test/integration_test.dart';
1516
import 'package:mockito/annotations.dart';
1617
import 'package:mockito/mockito.dart';
18+
import 'package:web/web.dart';
1719

1820
@GenerateNiceMocks(<MockSpec<dynamic>>[MockSpec<TileProvider>()])
1921
import 'overlays_test.mocks.dart';
@@ -38,13 +40,13 @@ void main() {
3840
/// 0.
3941
void probeTiles() {
4042
for (final gmaps.MapType? mapType in map.overlayMapTypes!.array!) {
41-
mapType?.getTile!(gmaps.Point(0, 0), 0, html.document);
43+
mapType?.getTile!(gmaps.Point(0, 0), 0, document);
4244
}
4345
}
4446

4547
setUp(() {
4648
controller = TileOverlaysController();
47-
map = gmaps.GMap(html.DivElement());
49+
map = gmaps.GMap(createDivElement());
4850
controller.googleMap = map;
4951

5052
tileProviders = <MockTileProvider>[

packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/shapes_test.dart

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
// found in the LICENSE file.
44

55
import 'dart:async';
6-
import 'dart:html' as html;
76
import 'dart:ui';
87

98
import 'package:flutter_test/flutter_test.dart';
109
import 'package:google_maps/google_maps.dart' as gmaps;
1110
import 'package:google_maps/google_maps_geometry.dart' as geometry;
1211
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';
1312
import 'package:google_maps_flutter_web/google_maps_flutter_web.dart';
13+
// ignore: implementation_imports
14+
import 'package:google_maps_flutter_web/src/utils.dart';
1415
import 'package:integration_test/integration_test.dart';
1516

1617
// This value is used when comparing the results of
@@ -25,7 +26,7 @@ void main() {
2526
late gmaps.GMap map;
2627

2728
setUp(() {
28-
map = gmaps.GMap(html.DivElement());
29+
map = gmaps.GMap(createDivElement());
2930
});
3031

3132
group('CirclesController', () {

packages/google_maps_flutter/google_maps_flutter_web/example/lib/main.dart

+4-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ class MyApp extends StatefulWidget {
2020
class _MyAppState extends State<MyApp> {
2121
@override
2222
Widget build(BuildContext context) {
23-
return const Text('Testing... Look at the console output for results!');
23+
return const Directionality(
24+
textDirection: TextDirection.ltr,
25+
child: Text('Testing... Look at the console output for results!'),
26+
);
2427
}
2528
}

packages/google_maps_flutter/google_maps_flutter_web/example/pubspec.yaml

+4-3
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,22 @@ publish_to: none
33

44
# Tests require flutter beta or greater to run.
55
environment:
6-
sdk: ^3.1.0
7-
flutter: ">=3.13.0"
6+
sdk: ^3.3.0
7+
flutter: ">=3.19.0"
88

99
dependencies:
1010
flutter:
1111
sdk: flutter
1212
google_maps_flutter_platform_interface: ^2.4.0
1313
google_maps_flutter_web:
1414
path: ../
15+
web: ^0.5.0
1516

1617
dev_dependencies:
1718
build_runner: ^2.1.1
1819
flutter_test:
1920
sdk: flutter
20-
google_maps: ^6.1.0
21+
google_maps: ^7.1.0
2122
google_maps_flutter: ^2.2.0 # Needed for projection_test.dart
2223
http: ">=0.13.0 <2.0.0"
2324
integration_test:

packages/google_maps_flutter/google_maps_flutter_web/lib/google_maps_flutter_web.dart

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ library google_maps_flutter_web;
66

77
import 'dart:async';
88
import 'dart:convert';
9-
import 'dart:html' hide VoidCallback;
10-
import 'dart:js_util';
9+
import 'dart:js_interop';
1110
import 'dart:ui_web' as ui_web;
1211

1312
import 'package:collection/collection.dart';
@@ -20,10 +19,14 @@ import 'package:google_maps/google_maps.dart' as gmaps;
2019
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';
2120
import 'package:sanitize_html/sanitize_html.dart';
2221
import 'package:stream_transform/stream_transform.dart';
22+
import 'package:web/web.dart';
2323

24+
import 'src/dom_window_extension.dart';
2425
import 'src/google_maps_inspector_web.dart';
26+
import 'src/map_styler.dart';
2527
import 'src/third_party/to_screen_location/to_screen_location.dart';
2628
import 'src/types.dart';
29+
import 'src/utils.dart';
2730

2831
part 'src/circle.dart';
2932
part 'src/circles.dart';

0 commit comments

Comments
 (0)