Add `buildViewWithTextDirection` to platform interface (#4121)
diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md
index 2dc533f..5d361d8 100644
--- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.1.1
+
+* Method `buildViewWithTextDirection` has been added to the platform interface.
+
## 2.1.0
* Add support for Hybrid Composition when building the Google Maps widget on Android. Set
diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart
index 41aedc7..2b9c71e 100644
--- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart
@@ -456,11 +456,7 @@
/// Defaults to false.
bool useAndroidViewSurface = false;
- /// Returns a widget displaying the map view.
- ///
- /// This method includes a parameter for platforms that require a text
- /// direction. For example, this should be used when using hybrid composition
- /// on Android.
+ @override
Widget buildViewWithTextDirection(
int creationId,
PlatformViewCreatedCallback onPlatformViewCreated, {
@@ -474,79 +470,6 @@
Set<Factory<OneSequenceGestureRecognizer>>? gestureRecognizers,
Map<String, dynamic> mapOptions = const <String, dynamic>{},
}) {
- if (defaultTargetPlatform == TargetPlatform.android &&
- useAndroidViewSurface) {
- final Map<String, dynamic> creationParams = <String, dynamic>{
- 'initialCameraPosition': initialCameraPosition.toMap(),
- 'options': mapOptions,
- 'markersToAdd': serializeMarkerSet(markers),
- 'polygonsToAdd': serializePolygonSet(polygons),
- 'polylinesToAdd': serializePolylineSet(polylines),
- 'circlesToAdd': serializeCircleSet(circles),
- 'tileOverlaysToAdd': serializeTileOverlaySet(tileOverlays),
- };
- return PlatformViewLink(
- viewType: 'plugins.flutter.io/google_maps',
- surfaceFactory: (
- BuildContext context,
- PlatformViewController controller,
- ) {
- return AndroidViewSurface(
- controller: controller as AndroidViewController,
- gestureRecognizers: gestureRecognizers ??
- const <Factory<OneSequenceGestureRecognizer>>{},
- hitTestBehavior: PlatformViewHitTestBehavior.opaque,
- );
- },
- onCreatePlatformView: (PlatformViewCreationParams params) {
- final SurfaceAndroidViewController controller =
- PlatformViewsService.initSurfaceAndroidView(
- id: params.id,
- viewType: 'plugins.flutter.io/google_maps',
- layoutDirection: textDirection,
- creationParams: creationParams,
- creationParamsCodec: const StandardMessageCodec(),
- onFocus: () => params.onFocusChanged(true),
- );
- controller.addOnPlatformViewCreatedListener(
- params.onPlatformViewCreated,
- );
- controller.addOnPlatformViewCreatedListener(
- onPlatformViewCreated,
- );
-
- controller.create();
- return controller;
- },
- );
- }
- return buildView(
- creationId,
- onPlatformViewCreated,
- initialCameraPosition: initialCameraPosition,
- markers: markers,
- polygons: polygons,
- polylines: polylines,
- circles: circles,
- tileOverlays: tileOverlays,
- gestureRecognizers: gestureRecognizers,
- mapOptions: mapOptions,
- );
- }
-
- @override
- Widget buildView(
- int creationId,
- PlatformViewCreatedCallback onPlatformViewCreated, {
- required CameraPosition initialCameraPosition,
- Set<Marker> markers = const <Marker>{},
- Set<Polygon> polygons = const <Polygon>{},
- Set<Polyline> polylines = const <Polyline>{},
- Set<Circle> circles = const <Circle>{},
- Set<TileOverlay> tileOverlays = const <TileOverlay>{},
- Set<Factory<OneSequenceGestureRecognizer>>? gestureRecognizers,
- Map<String, dynamic> mapOptions = const <String, dynamic>{},
- }) {
final Map<String, dynamic> creationParams = <String, dynamic>{
'initialCameraPosition': initialCameraPosition.toMap(),
'options': mapOptions,
@@ -556,14 +479,52 @@
'circlesToAdd': serializeCircleSet(circles),
'tileOverlaysToAdd': serializeTileOverlaySet(tileOverlays),
};
+
if (defaultTargetPlatform == TargetPlatform.android) {
- return AndroidView(
- viewType: 'plugins.flutter.io/google_maps',
- onPlatformViewCreated: onPlatformViewCreated,
- gestureRecognizers: gestureRecognizers,
- creationParams: creationParams,
- creationParamsCodec: const StandardMessageCodec(),
- );
+ if (useAndroidViewSurface) {
+ return PlatformViewLink(
+ viewType: 'plugins.flutter.io/google_maps',
+ surfaceFactory: (
+ BuildContext context,
+ PlatformViewController controller,
+ ) {
+ return AndroidViewSurface(
+ controller: controller as AndroidViewController,
+ gestureRecognizers: gestureRecognizers ??
+ const <Factory<OneSequenceGestureRecognizer>>{},
+ hitTestBehavior: PlatformViewHitTestBehavior.opaque,
+ );
+ },
+ onCreatePlatformView: (PlatformViewCreationParams params) {
+ final SurfaceAndroidViewController controller =
+ PlatformViewsService.initSurfaceAndroidView(
+ id: params.id,
+ viewType: 'plugins.flutter.io/google_maps',
+ layoutDirection: textDirection,
+ creationParams: creationParams,
+ creationParamsCodec: const StandardMessageCodec(),
+ onFocus: () => params.onFocusChanged(true),
+ );
+ controller.addOnPlatformViewCreatedListener(
+ params.onPlatformViewCreated,
+ );
+ controller.addOnPlatformViewCreatedListener(
+ onPlatformViewCreated,
+ );
+
+ controller.create();
+ return controller;
+ },
+ );
+ } else {
+ return AndroidView(
+ viewType: 'plugins.flutter.io/google_maps',
+ onPlatformViewCreated: onPlatformViewCreated,
+ gestureRecognizers: gestureRecognizers,
+ creationParams: creationParams,
+ creationParamsCodec: const StandardMessageCodec(),
+ );
+ }
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
return UiKitView(
viewType: 'plugins.flutter.io/google_maps',
@@ -573,7 +534,36 @@
creationParamsCodec: const StandardMessageCodec(),
);
}
+
return Text(
'$defaultTargetPlatform is not yet supported by the maps plugin');
}
+
+ @override
+ Widget buildView(
+ int creationId,
+ PlatformViewCreatedCallback onPlatformViewCreated, {
+ required CameraPosition initialCameraPosition,
+ Set<Marker> markers = const <Marker>{},
+ Set<Polygon> polygons = const <Polygon>{},
+ Set<Polyline> polylines = const <Polyline>{},
+ Set<Circle> circles = const <Circle>{},
+ Set<TileOverlay> tileOverlays = const <TileOverlay>{},
+ Set<Factory<OneSequenceGestureRecognizer>>? gestureRecognizers,
+ Map<String, dynamic> mapOptions = const <String, dynamic>{},
+ }) {
+ return buildViewWithTextDirection(
+ creationId,
+ onPlatformViewCreated,
+ initialCameraPosition: initialCameraPosition,
+ textDirection: TextDirection.ltr,
+ markers: markers,
+ polygons: polygons,
+ polylines: polylines,
+ circles: circles,
+ tileOverlays: tileOverlays,
+ gestureRecognizers: gestureRecognizers,
+ mapOptions: mapOptions,
+ );
+ }
}
diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_flutter_platform.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_flutter_platform.dart
index 425e040..2bb0ab2 100644
--- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_flutter_platform.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_flutter_platform.dart
@@ -338,7 +338,7 @@
throw UnimplementedError('dispose() has not been implemented.');
}
- /// Returns a widget displaying the map view
+ /// Returns a widget displaying the map view.
Widget buildView(
int creationId,
PlatformViewCreatedCallback onPlatformViewCreated, {
@@ -356,4 +356,40 @@
}) {
throw UnimplementedError('buildView() has not been implemented.');
}
+
+ /// Returns a widget displaying the map view.
+ ///
+ /// This method is similar to [buildView], but contains a parameter for
+ /// platforms that require a text direction.
+ ///
+ /// Default behavior passes all parameters except `textDirection` to
+ /// [buildView]. This is for backward compatibility with existing
+ /// implementations. Platforms that use the text direction should override
+ /// this as the primary implementation, and delegate to it from buildView.
+ Widget buildViewWithTextDirection(
+ int creationId,
+ PlatformViewCreatedCallback onPlatformViewCreated, {
+ required CameraPosition initialCameraPosition,
+ required TextDirection textDirection,
+ Set<Marker> markers = const <Marker>{},
+ Set<Polygon> polygons = const <Polygon>{},
+ Set<Polyline> polylines = const <Polyline>{},
+ Set<Circle> circles = const <Circle>{},
+ Set<TileOverlay> tileOverlays = const <TileOverlay>{},
+ Set<Factory<OneSequenceGestureRecognizer>>? gestureRecognizers,
+ Map<String, dynamic> mapOptions = const <String, dynamic>{},
+ }) {
+ return buildView(
+ creationId,
+ onPlatformViewCreated,
+ initialCameraPosition: initialCameraPosition,
+ markers: markers,
+ polygons: polygons,
+ polylines: polylines,
+ circles: circles,
+ tileOverlays: tileOverlays,
+ gestureRecognizers: gestureRecognizers,
+ mapOptions: mapOptions,
+ );
+ }
}
diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml
index 1ea425e..1dc73f4 100644
--- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml
+++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml
@@ -4,7 +4,7 @@
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22
# NOTE: We strongly prefer non-breaking changes, even at the expense of a
# less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 2.1.0
+version: 2.1.1
environment:
sdk: '>=2.12.0 <3.0.0'
diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/test/platform_interface/google_maps_flutter_platform_test.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/test/platform_interface/google_maps_flutter_platform_test.dart
index 2c50313..de4edf3 100644
--- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/test/platform_interface/google_maps_flutter_platform_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/test/platform_interface/google_maps_flutter_platform_test.dart
@@ -2,6 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/foundation.dart';
+import 'package:flutter/gestures.dart';
+import 'package:flutter/services.dart';
import 'package:mockito/mockito.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
@@ -34,6 +38,23 @@
test('Can be extended', () {
GoogleMapsFlutterPlatform.instance = ExtendsGoogleMapsFlutterPlatform();
});
+
+ test(
+ 'default implementation of `buildViewWithTextDirection` delegates to `buildView`',
+ () {
+ final GoogleMapsFlutterPlatform platform =
+ BuildViewGoogleMapsFlutterPlatform();
+ expect(
+ platform.buildViewWithTextDirection(
+ 0,
+ (_) {},
+ initialCameraPosition: CameraPosition(target: LatLng(0.0, 0.0)),
+ textDirection: TextDirection.ltr,
+ ),
+ isA<Text>(),
+ );
+ },
+ );
});
}
@@ -45,3 +66,22 @@
implements GoogleMapsFlutterPlatform {}
class ExtendsGoogleMapsFlutterPlatform extends GoogleMapsFlutterPlatform {}
+
+class BuildViewGoogleMapsFlutterPlatform extends GoogleMapsFlutterPlatform {
+ @override
+ Widget buildView(
+ int creationId,
+ PlatformViewCreatedCallback onPlatformViewCreated, {
+ required CameraPosition initialCameraPosition,
+ Set<Marker> markers = const <Marker>{},
+ Set<Polygon> polygons = const <Polygon>{},
+ Set<Polyline> polylines = const <Polyline>{},
+ Set<Circle> circles = const <Circle>{},
+ Set<TileOverlay> tileOverlays = const <TileOverlay>{},
+ Set<Factory<OneSequenceGestureRecognizer>>? gestureRecognizers =
+ const <Factory<OneSequenceGestureRecognizer>>{},
+ Map<String, dynamic> mapOptions = const <String, dynamic>{},
+ }) {
+ return const Text('');
+ }
+}