diff --git a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
index 5406dc5..0c95abd 100644
--- a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.0.11
+
+* Add additional marker drag events.
+
 ## 2.0.10
 
 * Update minimum Flutter SDK to 2.5 and iOS deployment target to 9.0.
diff --git a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java
index 056e106..9b88103 100644
--- a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java
+++ b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java
@@ -467,10 +467,14 @@
   }
 
   @Override
-  public void onMarkerDragStart(Marker marker) {}
+  public void onMarkerDragStart(Marker marker) {
+    markersController.onMarkerDragStart(marker.getId(), marker.getPosition());
+  }
 
   @Override
-  public void onMarkerDrag(Marker marker) {}
+  public void onMarkerDrag(Marker marker) {
+    markersController.onMarkerDrag(marker.getId(), marker.getPosition());
+  }
 
   @Override
   public void onMarkerDragEnd(Marker marker) {
diff --git a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java
index 189cba0..47ffe9b 100644
--- a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java
+++ b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java
@@ -105,6 +105,28 @@
     return false;
   }
 
+  void onMarkerDragStart(String googleMarkerId, LatLng latLng) {
+    String markerId = googleMapsMarkerIdToDartMarkerId.get(googleMarkerId);
+    if (markerId == null) {
+      return;
+    }
+    final Map<String, Object> data = new HashMap<>();
+    data.put("markerId", markerId);
+    data.put("position", Convert.latLngToJson(latLng));
+    methodChannel.invokeMethod("marker#onDragStart", data);
+  }
+
+  void onMarkerDrag(String googleMarkerId, LatLng latLng) {
+    String markerId = googleMapsMarkerIdToDartMarkerId.get(googleMarkerId);
+    if (markerId == null) {
+      return;
+    }
+    final Map<String, Object> data = new HashMap<>();
+    data.put("markerId", markerId);
+    data.put("position", Convert.latLngToJson(latLng));
+    methodChannel.invokeMethod("marker#onDrag", data);
+  }
+
   void onMarkerDragEnd(String googleMarkerId, LatLng latLng) {
     String markerId = googleMapsMarkerIdToDartMarkerId.get(googleMarkerId);
     if (markerId == null) {
diff --git a/packages/google_maps_flutter/google_maps_flutter/android/src/test/java/io/flutter/plugins/googlemaps/MarkersControllerTest.java b/packages/google_maps_flutter/google_maps_flutter/android/src/test/java/io/flutter/plugins/googlemaps/MarkersControllerTest.java
new file mode 100644
index 0000000..afe91d7
--- /dev/null
+++ b/packages/google_maps_flutter/google_maps_flutter/android/src/test/java/io/flutter/plugins/googlemaps/MarkersControllerTest.java
@@ -0,0 +1,131 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package io.flutter.plugins.googlemaps;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import com.google.android.gms.internal.maps.zzt;
+import com.google.android.gms.maps.GoogleMap;
+import com.google.android.gms.maps.model.LatLng;
+import com.google.android.gms.maps.model.Marker;
+import com.google.android.gms.maps.model.MarkerOptions;
+import io.flutter.plugin.common.BinaryMessenger;
+import io.flutter.plugin.common.MethodChannel;
+import io.flutter.plugin.common.MethodCodec;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class MarkersControllerTest {
+
+  @Test
+  public void controller_OnMarkerDragStart() {
+    final MethodChannel methodChannel =
+        spy(new MethodChannel(mock(BinaryMessenger.class), "no-name", mock(MethodCodec.class)));
+    final MarkersController controller = new MarkersController(methodChannel);
+    final GoogleMap googleMap = mock(GoogleMap.class);
+    controller.setGoogleMap(googleMap);
+
+    final zzt z = mock(zzt.class);
+    final Marker marker = new Marker(z);
+
+    final String googleMarkerId = "abc123";
+
+    when(marker.getId()).thenReturn(googleMarkerId);
+    when(googleMap.addMarker(any(MarkerOptions.class))).thenReturn(marker);
+
+    final LatLng latLng = new LatLng(1.1, 2.2);
+    final Map<String, String> markerOptions = new HashMap();
+    markerOptions.put("markerId", googleMarkerId);
+
+    final List<Object> markers = Arrays.<Object>asList(markerOptions);
+    controller.addMarkers(markers);
+    controller.onMarkerDragStart(googleMarkerId, latLng);
+
+    final List<Double> points = new ArrayList();
+    points.add(latLng.latitude);
+    points.add(latLng.longitude);
+
+    final Map<String, Object> data = new HashMap<>();
+    data.put("markerId", googleMarkerId);
+    data.put("position", points);
+    Mockito.verify(methodChannel).invokeMethod("marker#onDragStart", data);
+  }
+
+  @Test
+  public void controller_OnMarkerDragEnd() {
+    final MethodChannel methodChannel =
+        spy(new MethodChannel(mock(BinaryMessenger.class), "no-name", mock(MethodCodec.class)));
+    final MarkersController controller = new MarkersController(methodChannel);
+    final GoogleMap googleMap = mock(GoogleMap.class);
+    controller.setGoogleMap(googleMap);
+
+    final zzt z = mock(zzt.class);
+    final Marker marker = new Marker(z);
+
+    final String googleMarkerId = "abc123";
+
+    when(marker.getId()).thenReturn(googleMarkerId);
+    when(googleMap.addMarker(any(MarkerOptions.class))).thenReturn(marker);
+
+    final LatLng latLng = new LatLng(1.1, 2.2);
+    final Map<String, String> markerOptions = new HashMap();
+    markerOptions.put("markerId", googleMarkerId);
+
+    final List<Object> markers = Arrays.<Object>asList(markerOptions);
+    controller.addMarkers(markers);
+    controller.onMarkerDragEnd(googleMarkerId, latLng);
+
+    final List<Double> points = new ArrayList();
+    points.add(latLng.latitude);
+    points.add(latLng.longitude);
+
+    final Map<String, Object> data = new HashMap<>();
+    data.put("markerId", googleMarkerId);
+    data.put("position", points);
+    Mockito.verify(methodChannel).invokeMethod("marker#onDragEnd", data);
+  }
+
+  @Test
+  public void controller_OnMarkerDrag() {
+    final MethodChannel methodChannel =
+        spy(new MethodChannel(mock(BinaryMessenger.class), "no-name", mock(MethodCodec.class)));
+    final MarkersController controller = new MarkersController(methodChannel);
+    final GoogleMap googleMap = mock(GoogleMap.class);
+    controller.setGoogleMap(googleMap);
+
+    final zzt z = mock(zzt.class);
+    final Marker marker = new Marker(z);
+
+    final String googleMarkerId = "abc123";
+
+    when(marker.getId()).thenReturn(googleMarkerId);
+    when(googleMap.addMarker(any(MarkerOptions.class))).thenReturn(marker);
+
+    final LatLng latLng = new LatLng(1.1, 2.2);
+    final Map<String, String> markerOptions = new HashMap();
+    markerOptions.put("markerId", googleMarkerId);
+
+    final List<Object> markers = Arrays.<Object>asList(markerOptions);
+    controller.addMarkers(markers);
+    controller.onMarkerDrag(googleMarkerId, latLng);
+
+    final List<Double> points = new ArrayList();
+    points.add(latLng.latitude);
+    points.add(latLng.longitude);
+
+    final Map<String, Object> data = new HashMap<>();
+    data.put("markerId", googleMarkerId);
+    data.put("position", points);
+    Mockito.verify(methodChannel).invokeMethod("marker#onDrag", data);
+  }
+}
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/drag_marker.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/drag_marker.dart
new file mode 100644
index 0000000..2c79291
--- /dev/null
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/drag_marker.dart
@@ -0,0 +1,156 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// ignore_for_file: public_member_api_docs
+
+import 'dart:math';
+
+import 'package:flutter/material.dart';
+import 'package:google_maps_flutter/google_maps_flutter.dart';
+
+import 'page.dart';
+
+class DragMarkerPage extends GoogleMapExampleAppPage {
+  DragMarkerPage() : super(const Icon(Icons.drag_handle), 'Drag marker');
+
+  @override
+  Widget build(BuildContext context) {
+    return const DragMarkerBody();
+  }
+}
+
+class DragMarkerBody extends StatefulWidget {
+  const DragMarkerBody();
+
+  @override
+  State<StatefulWidget> createState() => DragMarkerBodyState();
+}
+
+typedef MarkerUpdateAction = Marker Function(Marker marker);
+
+class DragMarkerBodyState extends State<DragMarkerBody> {
+  DragMarkerBodyState();
+  static const LatLng center = LatLng(-33.86711, 151.1947171);
+
+  GoogleMapController? controller;
+  Map<MarkerId, Marker> markers = <MarkerId, Marker>{};
+  MarkerId? selectedMarker;
+  int _markerIdCounter = 1;
+  LatLng? markerPosition;
+
+  void _onMapCreated(GoogleMapController controller) {
+    this.controller = controller;
+  }
+
+  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;
+      });
+    }
+  }
+
+  void _onMarkerDrag(MarkerId markerId, LatLng newPosition) async {
+    setState(() {
+      this.markerPosition = newPosition;
+    });
+  }
+
+  void _add() {
+    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(
+      draggable: true,
+      markerId: markerId,
+      position: LatLng(
+        center.latitude + sin(_markerIdCounter * pi / 6.0) / 20.0,
+        center.longitude + cos(_markerIdCounter * pi / 6.0) / 20.0,
+      ),
+      infoWindow: InfoWindow(title: markerIdVal, snippet: '*'),
+      onTap: () => _onMarkerTapped(markerId),
+      onDrag: (LatLng position) => _onMarkerDrag(markerId, position),
+    );
+
+    setState(() {
+      markers[markerId] = marker;
+    });
+  }
+
+  void _remove() {
+    setState(() {
+      if (markers.containsKey(selectedMarker)) {
+        markers.remove(selectedMarker);
+      }
+    });
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Column(
+      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+      crossAxisAlignment: CrossAxisAlignment.stretch,
+      children: <Widget>[
+        Expanded(
+          child: Center(
+            child: GoogleMap(
+              onMapCreated: _onMapCreated,
+              initialCameraPosition: const CameraPosition(
+                target: center,
+                zoom: 11.0,
+              ),
+              markers: markers.values.toSet(),
+            ),
+          ),
+        ),
+        Container(
+          height: 30,
+          padding: EdgeInsets.only(left: 12, right: 12),
+          child: Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              markerPosition == null
+                  ? Container()
+                  : Expanded(child: Text("lat: ${markerPosition!.latitude}")),
+              markerPosition == null
+                  ? Container()
+                  : Expanded(child: Text("lng: ${markerPosition!.longitude}")),
+            ],
+          ),
+        ),
+        Row(
+          children: <Widget>[
+            TextButton(
+              child: const Text('add'),
+              onPressed: _add,
+            ),
+            TextButton(
+              child: const Text('remove'),
+              onPressed: _remove,
+            ),
+          ],
+        ),
+      ],
+    );
+  }
+}
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/main.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/main.dart
index 15b14db..16f242c 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/main.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/main.dart
@@ -5,6 +5,7 @@
 // ignore_for_file: public_member_api_docs
 
 import 'package:flutter/material.dart';
+import 'package:google_maps_flutter_example/drag_marker.dart';
 import 'package:google_maps_flutter_example/lite_mode.dart';
 import 'animate_camera.dart';
 import 'map_click.dart';
@@ -34,6 +35,7 @@
   PlacePolylinePage(),
   PlacePolygonPage(),
   PlaceCirclePage(),
+  DragMarkerPage(),
   PaddingPage(),
   SnapshotPage(),
   LiteModePage(),
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_marker.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_marker.dart
index 3d083e5..53f553e 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_marker.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_marker.dart
@@ -30,7 +30,7 @@
   State<StatefulWidget> createState() => PlaceMarkerBodyState();
 }
 
-typedef Marker MarkerUpdateAction(Marker marker);
+typedef MarkerUpdateAction = Marker Function(Marker marker);
 
 class PlaceMarkerBodyState extends State<PlaceMarkerBody> {
   PlaceMarkerBodyState();
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.m b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.m
index be37287..1428de6 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.m
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapController.m
@@ -509,6 +509,16 @@
   [_markersController onMarkerDragEnd:markerId coordinate:marker.position];
 }
 
+- (void)mapView:(GMSMapView*)mapView didStartDraggingMarker:(GMSMarker*)marker {
+  NSString* markerId = marker.userData[0];
+  [_markersController onMarkerDragStart:markerId coordinate:marker.position];
+}
+
+- (void)mapView:(GMSMapView*)mapView didDragMarker:(GMSMarker*)marker {
+  NSString* markerId = marker.userData[0];
+  [_markersController onMarkerDrag:markerId coordinate:marker.position];
+}
+
 - (void)mapView:(GMSMapView*)mapView didTapInfoWindowOfMarker:(GMSMarker*)marker {
   NSString* markerId = marker.userData[0];
   [_markersController onInfoWindowTap:markerId];
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h
index d3e8354..5625187 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h
@@ -45,7 +45,9 @@
 - (void)changeMarkers:(NSArray*)markersToChange;
 - (void)removeMarkerIds:(NSArray*)markerIdsToRemove;
 - (BOOL)onMarkerTap:(NSString*)markerId;
+- (void)onMarkerDragStart:(NSString*)markerId coordinate:(CLLocationCoordinate2D)coordinate;
 - (void)onMarkerDragEnd:(NSString*)markerId coordinate:(CLLocationCoordinate2D)coordinate;
+- (void)onMarkerDrag:(NSString*)markerId coordinate:(CLLocationCoordinate2D)coordinate;
 - (void)onInfoWindowTap:(NSString*)markerId;
 - (void)showMarkerInfoWindow:(NSString*)markerId result:(FlutterResult)result;
 - (void)hideMarkerInfoWindow:(NSString*)markerId result:(FlutterResult)result;
diff --git a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m
index 6a9fb88..51ed825 100644
--- a/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m
+++ b/packages/google_maps_flutter/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m
@@ -295,6 +295,28 @@
   [_methodChannel invokeMethod:@"marker#onTap" arguments:@{@"markerId" : markerId}];
   return controller.consumeTapEvents;
 }
+- (void)onMarkerDragStart:(NSString*)markerId coordinate:(CLLocationCoordinate2D)coordinate {
+  if (!markerId) {
+    return;
+  }
+  FLTGoogleMapMarkerController* controller = _markerIdToController[markerId];
+  if (!controller) {
+    return;
+  }
+  [_methodChannel invokeMethod:@"marker#onDragStart"
+                     arguments:@{@"markerId" : markerId, @"position" : PositionToJson(coordinate)}];
+}
+- (void)onMarkerDrag:(NSString*)markerId coordinate:(CLLocationCoordinate2D)coordinate {
+  if (!markerId) {
+    return;
+  }
+  FLTGoogleMapMarkerController* controller = _markerIdToController[markerId];
+  if (!controller) {
+    return;
+  }
+  [_methodChannel invokeMethod:@"marker#onDrag"
+                     arguments:@{@"markerId" : markerId, @"position" : PositionToJson(coordinate)}];
+}
 - (void)onMarkerDragEnd:(NSString*)markerId coordinate:(CLLocationCoordinate2D)coordinate {
   if (!markerId) {
     return;
diff --git a/packages/google_maps_flutter/google_maps_flutter/lib/src/controller.dart b/packages/google_maps_flutter/google_maps_flutter/lib/src/controller.dart
index ba18c5f..d57ac97 100644
--- a/packages/google_maps_flutter/google_maps_flutter/lib/src/controller.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/lib/src/controller.dart
@@ -69,6 +69,12 @@
     GoogleMapsFlutterPlatform.instance
         .onMarkerTap(mapId: mapId)
         .listen((MarkerTapEvent e) => _googleMapState.onMarkerTap(e.value));
+    GoogleMapsFlutterPlatform.instance.onMarkerDragStart(mapId: mapId).listen(
+        (MarkerDragStartEvent e) =>
+            _googleMapState.onMarkerDragStart(e.value, e.position));
+    GoogleMapsFlutterPlatform.instance.onMarkerDrag(mapId: mapId).listen(
+        (MarkerDragEvent e) =>
+            _googleMapState.onMarkerDrag(e.value, e.position));
     GoogleMapsFlutterPlatform.instance.onMarkerDragEnd(mapId: mapId).listen(
         (MarkerDragEndEvent e) =>
             _googleMapState.onMarkerDragEnd(e.value, e.position));
diff --git a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart
index 26b9d6b..b4ffd22 100644
--- a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart
@@ -8,7 +8,7 @@
 ///
 /// Pass to [GoogleMap.onMapCreated] to receive a [GoogleMapController] when the
 /// map is created.
-typedef void MapCreatedCallback(GoogleMapController controller);
+typedef MapCreatedCallback = void Function(GoogleMapController controller);
 
 // This counter is used to provide a stable "constant" initialization id
 // to the buildView function, so the web implementation can use it as a
@@ -368,6 +368,30 @@
     }
   }
 
+  void onMarkerDragStart(MarkerId markerId, LatLng position) {
+    assert(markerId != null);
+    final Marker? marker = _markers[markerId];
+    if (marker == null) {
+      throw UnknownMapObjectIdError('marker', markerId, 'onDragStart');
+    }
+    final ValueChanged<LatLng>? onDragStart = marker.onDragStart;
+    if (onDragStart != null) {
+      onDragStart(position);
+    }
+  }
+
+  void onMarkerDrag(MarkerId markerId, LatLng position) {
+    assert(markerId != null);
+    final Marker? marker = _markers[markerId];
+    if (marker == null) {
+      throw UnknownMapObjectIdError('marker', markerId, 'onDrag');
+    }
+    final ValueChanged<LatLng>? onDrag = marker.onDrag;
+    if (onDrag != null) {
+      onDrag(position);
+    }
+  }
+
   void onMarkerDragEnd(MarkerId markerId, LatLng position) {
     assert(markerId != null);
     final Marker? marker = _markers[markerId];
diff --git a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
index 641e475..61ac88a 100644
--- a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
+++ b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
@@ -2,7 +2,7 @@
 description: A Flutter plugin for integrating Google Maps in iOS and Android applications.
 repository: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter/google_maps_flutter
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22
-version: 2.0.10
+version: 2.0.11
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
@@ -21,7 +21,7 @@
   flutter:
     sdk: flutter
   flutter_plugin_android_lifecycle: ^2.0.1
-  google_maps_flutter_platform_interface: ^2.0.0
+  google_maps_flutter_platform_interface: ^2.1.2
 
 dev_dependencies:
   flutter_test:
diff --git a/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart
index 6e0f5ed..6b3ac90 100644
--- a/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart
@@ -230,6 +230,16 @@
   }
 
   @override
+  Stream<MarkerDragStartEvent> onMarkerDragStart({required int mapId}) {
+    return mapEventStreamController.stream.whereType<MarkerDragStartEvent>();
+  }
+
+  @override
+  Stream<MarkerDragEvent> onMarkerDrag({required int mapId}) {
+    return mapEventStreamController.stream.whereType<MarkerDragEvent>();
+  }
+
+  @override
   Stream<MarkerDragEndEvent> onMarkerDragEnd({required int mapId}) {
     return mapEventStreamController.stream.whereType<MarkerDragEndEvent>();
   }
