Skip to content

Commit 19f2ff7

Browse files
Add buildViewWithTextDirection to platform interface (flutter#4121)
1 parent b9512b6 commit 19f2ff7

File tree

5 files changed

+157
-87
lines changed

5 files changed

+157
-87
lines changed

packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.1.1
2+
3+
* Method `buildViewWithTextDirection` has been added to the platform interface.
4+
15
## 2.1.0
26

37
* Add support for Hybrid Composition when building the Google Maps widget on Android. Set

packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart

Lines changed: 75 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -456,11 +456,7 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform {
456456
/// Defaults to false.
457457
bool useAndroidViewSurface = false;
458458

459-
/// Returns a widget displaying the map view.
460-
///
461-
/// This method includes a parameter for platforms that require a text
462-
/// direction. For example, this should be used when using hybrid composition
463-
/// on Android.
459+
@override
464460
Widget buildViewWithTextDirection(
465461
int creationId,
466462
PlatformViewCreatedCallback onPlatformViewCreated, {
@@ -473,79 +469,6 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform {
473469
Set<TileOverlay> tileOverlays = const <TileOverlay>{},
474470
Set<Factory<OneSequenceGestureRecognizer>>? gestureRecognizers,
475471
Map<String, dynamic> mapOptions = const <String, dynamic>{},
476-
}) {
477-
if (defaultTargetPlatform == TargetPlatform.android &&
478-
useAndroidViewSurface) {
479-
final Map<String, dynamic> creationParams = <String, dynamic>{
480-
'initialCameraPosition': initialCameraPosition.toMap(),
481-
'options': mapOptions,
482-
'markersToAdd': serializeMarkerSet(markers),
483-
'polygonsToAdd': serializePolygonSet(polygons),
484-
'polylinesToAdd': serializePolylineSet(polylines),
485-
'circlesToAdd': serializeCircleSet(circles),
486-
'tileOverlaysToAdd': serializeTileOverlaySet(tileOverlays),
487-
};
488-
return PlatformViewLink(
489-
viewType: 'plugins.flutter.io/google_maps',
490-
surfaceFactory: (
491-
BuildContext context,
492-
PlatformViewController controller,
493-
) {
494-
return AndroidViewSurface(
495-
controller: controller as AndroidViewController,
496-
gestureRecognizers: gestureRecognizers ??
497-
const <Factory<OneSequenceGestureRecognizer>>{},
498-
hitTestBehavior: PlatformViewHitTestBehavior.opaque,
499-
);
500-
},
501-
onCreatePlatformView: (PlatformViewCreationParams params) {
502-
final SurfaceAndroidViewController controller =
503-
PlatformViewsService.initSurfaceAndroidView(
504-
id: params.id,
505-
viewType: 'plugins.flutter.io/google_maps',
506-
layoutDirection: textDirection,
507-
creationParams: creationParams,
508-
creationParamsCodec: const StandardMessageCodec(),
509-
onFocus: () => params.onFocusChanged(true),
510-
);
511-
controller.addOnPlatformViewCreatedListener(
512-
params.onPlatformViewCreated,
513-
);
514-
controller.addOnPlatformViewCreatedListener(
515-
onPlatformViewCreated,
516-
);
517-
518-
controller.create();
519-
return controller;
520-
},
521-
);
522-
}
523-
return buildView(
524-
creationId,
525-
onPlatformViewCreated,
526-
initialCameraPosition: initialCameraPosition,
527-
markers: markers,
528-
polygons: polygons,
529-
polylines: polylines,
530-
circles: circles,
531-
tileOverlays: tileOverlays,
532-
gestureRecognizers: gestureRecognizers,
533-
mapOptions: mapOptions,
534-
);
535-
}
536-
537-
@override
538-
Widget buildView(
539-
int creationId,
540-
PlatformViewCreatedCallback onPlatformViewCreated, {
541-
required CameraPosition initialCameraPosition,
542-
Set<Marker> markers = const <Marker>{},
543-
Set<Polygon> polygons = const <Polygon>{},
544-
Set<Polyline> polylines = const <Polyline>{},
545-
Set<Circle> circles = const <Circle>{},
546-
Set<TileOverlay> tileOverlays = const <TileOverlay>{},
547-
Set<Factory<OneSequenceGestureRecognizer>>? gestureRecognizers,
548-
Map<String, dynamic> mapOptions = const <String, dynamic>{},
549472
}) {
550473
final Map<String, dynamic> creationParams = <String, dynamic>{
551474
'initialCameraPosition': initialCameraPosition.toMap(),
@@ -556,14 +479,52 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform {
556479
'circlesToAdd': serializeCircleSet(circles),
557480
'tileOverlaysToAdd': serializeTileOverlaySet(tileOverlays),
558481
};
482+
559483
if (defaultTargetPlatform == TargetPlatform.android) {
560-
return AndroidView(
561-
viewType: 'plugins.flutter.io/google_maps',
562-
onPlatformViewCreated: onPlatformViewCreated,
563-
gestureRecognizers: gestureRecognizers,
564-
creationParams: creationParams,
565-
creationParamsCodec: const StandardMessageCodec(),
566-
);
484+
if (useAndroidViewSurface) {
485+
return PlatformViewLink(
486+
viewType: 'plugins.flutter.io/google_maps',
487+
surfaceFactory: (
488+
BuildContext context,
489+
PlatformViewController controller,
490+
) {
491+
return AndroidViewSurface(
492+
controller: controller as AndroidViewController,
493+
gestureRecognizers: gestureRecognizers ??
494+
const <Factory<OneSequenceGestureRecognizer>>{},
495+
hitTestBehavior: PlatformViewHitTestBehavior.opaque,
496+
);
497+
},
498+
onCreatePlatformView: (PlatformViewCreationParams params) {
499+
final SurfaceAndroidViewController controller =
500+
PlatformViewsService.initSurfaceAndroidView(
501+
id: params.id,
502+
viewType: 'plugins.flutter.io/google_maps',
503+
layoutDirection: textDirection,
504+
creationParams: creationParams,
505+
creationParamsCodec: const StandardMessageCodec(),
506+
onFocus: () => params.onFocusChanged(true),
507+
);
508+
controller.addOnPlatformViewCreatedListener(
509+
params.onPlatformViewCreated,
510+
);
511+
controller.addOnPlatformViewCreatedListener(
512+
onPlatformViewCreated,
513+
);
514+
515+
controller.create();
516+
return controller;
517+
},
518+
);
519+
} else {
520+
return AndroidView(
521+
viewType: 'plugins.flutter.io/google_maps',
522+
onPlatformViewCreated: onPlatformViewCreated,
523+
gestureRecognizers: gestureRecognizers,
524+
creationParams: creationParams,
525+
creationParamsCodec: const StandardMessageCodec(),
526+
);
527+
}
567528
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
568529
return UiKitView(
569530
viewType: 'plugins.flutter.io/google_maps',
@@ -573,7 +534,36 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform {
573534
creationParamsCodec: const StandardMessageCodec(),
574535
);
575536
}
537+
576538
return Text(
577539
'$defaultTargetPlatform is not yet supported by the maps plugin');
578540
}
541+
542+
@override
543+
Widget buildView(
544+
int creationId,
545+
PlatformViewCreatedCallback onPlatformViewCreated, {
546+
required CameraPosition initialCameraPosition,
547+
Set<Marker> markers = const <Marker>{},
548+
Set<Polygon> polygons = const <Polygon>{},
549+
Set<Polyline> polylines = const <Polyline>{},
550+
Set<Circle> circles = const <Circle>{},
551+
Set<TileOverlay> tileOverlays = const <TileOverlay>{},
552+
Set<Factory<OneSequenceGestureRecognizer>>? gestureRecognizers,
553+
Map<String, dynamic> mapOptions = const <String, dynamic>{},
554+
}) {
555+
return buildViewWithTextDirection(
556+
creationId,
557+
onPlatformViewCreated,
558+
initialCameraPosition: initialCameraPosition,
559+
textDirection: TextDirection.ltr,
560+
markers: markers,
561+
polygons: polygons,
562+
polylines: polylines,
563+
circles: circles,
564+
tileOverlays: tileOverlays,
565+
gestureRecognizers: gestureRecognizers,
566+
mapOptions: mapOptions,
567+
);
568+
}
579569
}

packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_flutter_platform.dart

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ abstract class GoogleMapsFlutterPlatform extends PlatformInterface {
338338
throw UnimplementedError('dispose() has not been implemented.');
339339
}
340340

341-
/// Returns a widget displaying the map view
341+
/// Returns a widget displaying the map view.
342342
Widget buildView(
343343
int creationId,
344344
PlatformViewCreatedCallback onPlatformViewCreated, {
@@ -356,4 +356,40 @@ abstract class GoogleMapsFlutterPlatform extends PlatformInterface {
356356
}) {
357357
throw UnimplementedError('buildView() has not been implemented.');
358358
}
359+
360+
/// Returns a widget displaying the map view.
361+
///
362+
/// This method is similar to [buildView], but contains a parameter for
363+
/// platforms that require a text direction.
364+
///
365+
/// Default behavior passes all parameters except `textDirection` to
366+
/// [buildView]. This is for backward compatibility with existing
367+
/// implementations. Platforms that use the text direction should override
368+
/// this as the primary implementation, and delegate to it from buildView.
369+
Widget buildViewWithTextDirection(
370+
int creationId,
371+
PlatformViewCreatedCallback onPlatformViewCreated, {
372+
required CameraPosition initialCameraPosition,
373+
required TextDirection textDirection,
374+
Set<Marker> markers = const <Marker>{},
375+
Set<Polygon> polygons = const <Polygon>{},
376+
Set<Polyline> polylines = const <Polyline>{},
377+
Set<Circle> circles = const <Circle>{},
378+
Set<TileOverlay> tileOverlays = const <TileOverlay>{},
379+
Set<Factory<OneSequenceGestureRecognizer>>? gestureRecognizers,
380+
Map<String, dynamic> mapOptions = const <String, dynamic>{},
381+
}) {
382+
return buildView(
383+
creationId,
384+
onPlatformViewCreated,
385+
initialCameraPosition: initialCameraPosition,
386+
markers: markers,
387+
polygons: polygons,
388+
polylines: polylines,
389+
circles: circles,
390+
tileOverlays: tileOverlays,
391+
gestureRecognizers: gestureRecognizers,
392+
mapOptions: mapOptions,
393+
);
394+
}
359395
}

packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/master/packages/google_maps_
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22
55
# NOTE: We strongly prefer non-breaking changes, even at the expense of a
66
# less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
7-
version: 2.1.0
7+
version: 2.1.1
88

99
environment:
1010
sdk: '>=2.12.0 <3.0.0'

packages/google_maps_flutter/google_maps_flutter_platform_interface/test/platform_interface/google_maps_flutter_platform_test.dart

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
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 'package:flutter/cupertino.dart';
6+
import 'package:flutter/foundation.dart';
7+
import 'package:flutter/gestures.dart';
8+
import 'package:flutter/services.dart';
59
import 'package:mockito/mockito.dart';
610
import 'package:flutter_test/flutter_test.dart';
711
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
@@ -34,6 +38,23 @@ void main() {
3438
test('Can be extended', () {
3539
GoogleMapsFlutterPlatform.instance = ExtendsGoogleMapsFlutterPlatform();
3640
});
41+
42+
test(
43+
'default implementation of `buildViewWithTextDirection` delegates to `buildView`',
44+
() {
45+
final GoogleMapsFlutterPlatform platform =
46+
BuildViewGoogleMapsFlutterPlatform();
47+
expect(
48+
platform.buildViewWithTextDirection(
49+
0,
50+
(_) {},
51+
initialCameraPosition: CameraPosition(target: LatLng(0.0, 0.0)),
52+
textDirection: TextDirection.ltr,
53+
),
54+
isA<Text>(),
55+
);
56+
},
57+
);
3758
});
3859
}
3960

@@ -45,3 +66,22 @@ class ImplementsGoogleMapsFlutterPlatform extends Mock
4566
implements GoogleMapsFlutterPlatform {}
4667

4768
class ExtendsGoogleMapsFlutterPlatform extends GoogleMapsFlutterPlatform {}
69+
70+
class BuildViewGoogleMapsFlutterPlatform extends GoogleMapsFlutterPlatform {
71+
@override
72+
Widget buildView(
73+
int creationId,
74+
PlatformViewCreatedCallback onPlatformViewCreated, {
75+
required CameraPosition initialCameraPosition,
76+
Set<Marker> markers = const <Marker>{},
77+
Set<Polygon> polygons = const <Polygon>{},
78+
Set<Polyline> polylines = const <Polyline>{},
79+
Set<Circle> circles = const <Circle>{},
80+
Set<TileOverlay> tileOverlays = const <TileOverlay>{},
81+
Set<Factory<OneSequenceGestureRecognizer>>? gestureRecognizers =
82+
const <Factory<OneSequenceGestureRecognizer>>{},
83+
Map<String, dynamic> mapOptions = const <String, dynamic>{},
84+
}) {
85+
return const Text('');
86+
}
87+
}

0 commit comments

Comments
 (0)