Skip to content

Commit d60e4fc

Browse files
committed
Only update tile overlays and notifying of map creation if map is still mounted
1 parent a5cc6c8 commit d60e4fc

File tree

3 files changed

+42
-5
lines changed

3 files changed

+42
-5
lines changed

packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -517,10 +517,12 @@ class _GoogleMapState extends State<GoogleMap> {
517517
this,
518518
);
519519
_controller.complete(controller);
520-
_updateTileOverlays(controller);
521-
final MapCreatedCallback? onMapCreated = widget.onMapCreated;
522-
if (onMapCreated != null) {
523-
onMapCreated(controller);
520+
if (mounted) {
521+
_updateTileOverlays(controller);
522+
final MapCreatedCallback? onMapCreated = widget.onMapCreated;
523+
if (onMapCreated != null) {
524+
onMapCreated(controller);
525+
}
524526
}
525527
}
526528

packages/google_maps_flutter/google_maps_flutter/test/fake_google_maps_flutter_platform.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,17 @@ class FakeGoogleMapsFlutterPlatform extends GoogleMapsFlutterPlatform {
3737
final StreamController<MapEvent<dynamic>> mapEventStreamController =
3838
StreamController<MapEvent<dynamic>>.broadcast();
3939

40+
// Overrides completion of the init.
41+
Completer<void>? initCompleter;
42+
4043
@override
41-
Future<void> init(int mapId) async {}
44+
Future<void> init(int mapId) {
45+
if (initCompleter == null) {
46+
return Future<void>.value();
47+
}
48+
49+
return initCompleter!.future;
50+
}
4251

4352
@override
4453
Future<void> updateMapConfiguration(

packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5+
import 'dart:async';
6+
57
import 'package:flutter/widgets.dart';
68
import 'package:flutter_test/flutter_test.dart';
79
import 'package:google_maps_flutter/google_maps_flutter.dart';
@@ -610,4 +612,28 @@ void main() {
610612

611613
expect(map.circleUpdates.length, 1);
612614
});
615+
616+
testWidgets('Update state after map is initialized only when mounted',
617+
(WidgetTester tester) async {
618+
platform.initCompleter = Completer<void>();
619+
620+
await tester.pumpWidget(
621+
const Directionality(
622+
textDirection: TextDirection.ltr,
623+
child: GoogleMap(
624+
initialCameraPosition: CameraPosition(target: LatLng(10.0, 15.0)),
625+
),
626+
),
627+
);
628+
629+
await tester.pumpWidget(Container());
630+
631+
platform.initCompleter!.complete();
632+
633+
await tester.pumpAndSettle();
634+
635+
final PlatformMapStateRecorder map = platform.lastCreatedMap;
636+
637+
expect(map.tileOverlaySets.length, 1);
638+
});
613639
}

0 commit comments

Comments
 (0)