From 7a46e96bb28771f36947249dbae28c60eeb8c491 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Thu, 3 Jun 2021 09:42:07 -0700 Subject: [PATCH 01/13] add support for hybrid composition on Android --- .../CHANGELOG.md | 5 ++ .../method_channel_google_maps_flutter.dart | 48 ++++++++++++++++++- .../pubspec.yaml | 2 +- 3 files changed, 53 insertions(+), 2 deletions(-) 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 b6603d66fa89..2dc533fe1dfa 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,8 @@ +## 2.1.0 + +* Add support for Hybrid Composition when building the Google Maps widget on Android. Set + `MethodChannelGoogleMapsFlutter.useAndroidViewSurface` to `true` to build with Hybrid Composition. + ## 2.0.4 * Preserve the `TileProvider` when copying `TileOverlay`, fixing a 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 49029cc3d22d..e964ecc29a22 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 @@ -8,6 +8,7 @@ import 'dart:typed_data'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; import 'package:stream_transform/stream_transform.dart'; @@ -441,6 +442,15 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { return channel(mapId).invokeMethod('map#takeSnapshot'); } + /// Set [GoogleMapsFlutterPlatform] to uses [AndroidViewSurface] to build the Google Maps widget. + /// + /// This implementation uses hybrid composition to render the Google Maps + /// Widget on Android. This comes at the cost of some performance on Android + /// versions below 10. See + /// https://github.com/flutter/flutter/wiki/Hybrid-Composition for more + /// information. + bool useAndroidViewSurface = false; + @override Widget buildView( int creationId, @@ -463,7 +473,43 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { 'circlesToAdd': serializeCircleSet(circles), 'tileOverlaysToAdd': serializeTileOverlaySet(tileOverlays), }; - if (defaultTargetPlatform == TargetPlatform.android) { + if (defaultTargetPlatform == TargetPlatform.android && + useAndroidViewSurface) { + return PlatformViewLink( + viewType: 'plugins.flutter.io/google_maps', + surfaceFactory: ( + BuildContext context, + PlatformViewController controller, + ) { + return AndroidViewSurface( + controller: controller as AndroidViewController, + gestureRecognizers: gestureRecognizers ?? + const >{}, + hitTestBehavior: PlatformViewHitTestBehavior.opaque, + ); + }, + onCreatePlatformView: (PlatformViewCreationParams params) { + final SurfaceAndroidViewController controller = + PlatformViewsService.initSurfaceAndroidView( + id: params.id, + viewType: 'plugins.flutter.io/google_maps', + layoutDirection: TextDirection.rtl, + creationParams: creationParams, + creationParamsCodec: const StandardMessageCodec(), + ); + controller.addOnPlatformViewCreatedListener( + params.onPlatformViewCreated, + ); + controller.addOnPlatformViewCreatedListener( + onPlatformViewCreated, + ); + + controller.create(); + return controller; + }, + ); + } else if (defaultTargetPlatform == TargetPlatform.android && + !useAndroidViewSurface) { return AndroidView( viewType: 'plugins.flutter.io/google_maps', onPlatformViewCreated: onPlatformViewCreated, 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 1fdd97d51141..9877dbc27d81 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 @@ -3,7 +3,7 @@ description: A common platform interface for the google_maps_flutter plugin. homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter/google_maps_flutter_platform_interface # 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.0.4 +version: 2.1.0 dependencies: flutter: From 691622012ddd5278715efc75a1b0aaf837c04bb0 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 4 Jun 2021 02:12:28 -0700 Subject: [PATCH 02/13] export method channel platform interface --- .../lib/google_maps_flutter_platform_interface.dart | 1 + .../src/method_channel/method_channel_google_maps_flutter.dart | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/google_maps_flutter_platform_interface.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/google_maps_flutter_platform_interface.dart index 650a839cb676..9f93c473c548 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/google_maps_flutter_platform_interface.dart +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/google_maps_flutter_platform_interface.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +export 'src/method_channel/method_channel_google_maps_flutter.dart' show MethodChannelGoogleMapsFlutter; export 'src/platform_interface/google_maps_flutter_platform.dart'; export 'src/types/types.dart'; export 'src/events/map_event.dart'; 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 e964ecc29a22..15e6f44462da 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 @@ -449,6 +449,8 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { /// versions below 10. See /// https://github.com/flutter/flutter/wiki/Hybrid-Composition for more /// information. + /// + /// Defaults to false. bool useAndroidViewSurface = false; @override From 16eeb0128e16a19781ea9006e201cf13f2e8d36d Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 4 Jun 2021 02:14:11 -0700 Subject: [PATCH 03/13] version bump --- .../google_maps_flutter_platform_interface/CHANGELOG.md | 4 ++++ .../google_maps_flutter_platform_interface/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) 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 2dc533fe1dfa..4d5b1e53e61f 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.2.0 + +* Add support to opt into hybrid composition on Android. + ## 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/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml index 9877dbc27d81..c742c622d2c9 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 @@ -3,7 +3,7 @@ description: A common platform interface for the google_maps_flutter plugin. homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter/google_maps_flutter_platform_interface # 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.2.0 dependencies: flutter: From 9f4443604bae36480844c2d8e5d33a72b91fcf63 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 4 Jun 2021 20:51:32 -0700 Subject: [PATCH 04/13] add tests --- .../test/google_map_test.dart | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart index 2b754afbd359..142593632296 100644 --- a/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -587,4 +588,36 @@ void main() { expect(platformGoogleMap.buildingsEnabled, true); }); + + testWidgets( + 'Default Android widget is AndroidView', + (WidgetTester tester) async { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + await tester.pumpWidget( + const Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + initialCameraPosition: CameraPosition(target: LatLng(10.0, 15.0)), + ), + ), + ); + + expect(find.byType(AndroidView), findsOneWidget); + }, + ); + + // TODO(bparrishMines): + // testWidgets('Use AndroidViewSurface on Android', (WidgetTester tester) async { + // debugDefaultTargetPlatformOverride = TargetPlatform.android; + // await tester.pumpWidget( + // const Directionality( + // textDirection: TextDirection.ltr, + // child: GoogleMap( + // initialCameraPosition: CameraPosition(target: LatLng(10.0, 15.0)), + // ), + // ), + // ); + // + // expect(find.byType(AndroidViewSurface), findsOneWidget); + // }); } From 091a05f1ad62a591d2de1afbea668af1db0a6f9f Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 4 Jun 2021 20:54:47 -0700 Subject: [PATCH 05/13] remove duplicate version bump --- .../google_maps_flutter_platform_interface/CHANGELOG.md | 4 ---- .../google_maps_flutter_platform_interface/pubspec.yaml | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) 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 4d5b1e53e61f..2dc533fe1dfa 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,7 +1,3 @@ -## 2.2.0 - -* Add support to opt into hybrid composition on Android. - ## 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/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml index c742c622d2c9..9877dbc27d81 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 @@ -3,7 +3,7 @@ description: A common platform interface for the google_maps_flutter plugin. homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter/google_maps_flutter_platform_interface # 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.2.0 +version: 2.1.0 dependencies: flutter: From a6a1c4127f54949750115c0b9bc43e8fce86ade4 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 4 Jun 2021 21:43:01 -0700 Subject: [PATCH 06/13] formatting and add comment for future test --- .../google_maps_flutter/test/google_map_test.dart | 2 +- .../lib/google_maps_flutter_platform_interface.dart | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart index 142593632296..e8bb2f27e64f 100644 --- a/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart @@ -606,7 +606,7 @@ void main() { }, ); - // TODO(bparrishMines): + // TODO(bparrishMines): Uncomment once https://github.com/flutter/plugins/pull/4017 has landed. // testWidgets('Use AndroidViewSurface on Android', (WidgetTester tester) async { // debugDefaultTargetPlatformOverride = TargetPlatform.android; // await tester.pumpWidget( diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/google_maps_flutter_platform_interface.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/google_maps_flutter_platform_interface.dart index 9f93c473c548..300700071102 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/google_maps_flutter_platform_interface.dart +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/google_maps_flutter_platform_interface.dart @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -export 'src/method_channel/method_channel_google_maps_flutter.dart' show MethodChannelGoogleMapsFlutter; +export 'src/method_channel/method_channel_google_maps_flutter.dart' + show MethodChannelGoogleMapsFlutter; export 'src/platform_interface/google_maps_flutter_platform.dart'; export 'src/types/types.dart'; export 'src/events/map_event.dart'; From 2deb78da364746351d759dba6d749dc402efdf9c Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 4 Jun 2021 23:32:09 -0700 Subject: [PATCH 07/13] cheat to get tests to pass --- .../google_maps_flutter/test/google_map_test.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart index e8bb2f27e64f..8b3e7f9bd4b7 100644 --- a/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart @@ -592,7 +592,6 @@ void main() { testWidgets( 'Default Android widget is AndroidView', (WidgetTester tester) async { - debugDefaultTargetPlatformOverride = TargetPlatform.android; await tester.pumpWidget( const Directionality( textDirection: TextDirection.ltr, @@ -608,7 +607,6 @@ void main() { // TODO(bparrishMines): Uncomment once https://github.com/flutter/plugins/pull/4017 has landed. // testWidgets('Use AndroidViewSurface on Android', (WidgetTester tester) async { - // debugDefaultTargetPlatformOverride = TargetPlatform.android; // await tester.pumpWidget( // const Directionality( // textDirection: TextDirection.ltr, From 85c30ae6e3d8e4eaf20deeffb5f2b7285373dcca Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Tue, 8 Jun 2021 15:26:08 -0700 Subject: [PATCH 08/13] comments --- .../google_maps_flutter/test/google_map_test.dart | 1 - .../method_channel/method_channel_google_maps_flutter.dart | 7 ++++--- .../platform_interface/google_maps_flutter_platform.dart | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart index 8b3e7f9bd4b7..d1ec87a4730d 100644 --- a/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter/test/google_map_test.dart @@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; 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 15e6f44462da..67c22cacb9e9 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 @@ -458,6 +458,7 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { int creationId, PlatformViewCreatedCallback onPlatformViewCreated, { required CameraPosition initialCameraPosition, + required TextDirection textDirection, Set markers = const {}, Set polygons = const {}, Set polylines = const {}, @@ -495,9 +496,10 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { PlatformViewsService.initSurfaceAndroidView( id: params.id, viewType: 'plugins.flutter.io/google_maps', - layoutDirection: TextDirection.rtl, + layoutDirection: textDirection, creationParams: creationParams, creationParamsCodec: const StandardMessageCodec(), + onFocus: () => params.onFocusChanged(true), ); controller.addOnPlatformViewCreatedListener( params.onPlatformViewCreated, @@ -510,8 +512,7 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { return controller; }, ); - } else if (defaultTargetPlatform == TargetPlatform.android && - !useAndroidViewSurface) { + } else if (defaultTargetPlatform == TargetPlatform.android) { return AndroidView( viewType: 'plugins.flutter.io/google_maps', onPlatformViewCreated: onPlatformViewCreated, 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 425e040ee812..152b49b30c3f 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 @@ -343,6 +343,7 @@ abstract class GoogleMapsFlutterPlatform extends PlatformInterface { int creationId, PlatformViewCreatedCallback onPlatformViewCreated, { required CameraPosition initialCameraPosition, + required TextDirection textDirection, Set markers = const {}, Set polygons = const {}, Set polylines = const {}, From 4dbe1bccda12c13f8429f5c70319b16e48882ce6 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Tue, 8 Jun 2021 15:27:36 -0700 Subject: [PATCH 09/13] Update packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart Co-authored-by: Emmanuel Garcia --- .../src/method_channel/method_channel_google_maps_flutter.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 67c22cacb9e9..c4d3e66fb13e 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 @@ -442,7 +442,7 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { return channel(mapId).invokeMethod('map#takeSnapshot'); } - /// Set [GoogleMapsFlutterPlatform] to uses [AndroidViewSurface] to build the Google Maps widget. + /// Set [GoogleMapsFlutterPlatform] to use [AndroidViewSurface] to build the Google Maps widget. /// /// This implementation uses hybrid composition to render the Google Maps /// Widget on Android. This comes at the cost of some performance on Android From 2975535740ec089ce2989fd091a0d69b48964a9d Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Tue, 8 Jun 2021 15:27:43 -0700 Subject: [PATCH 10/13] Update packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart Co-authored-by: Emmanuel Garcia --- .../src/method_channel/method_channel_google_maps_flutter.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c4d3e66fb13e..4945096916d7 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 @@ -447,7 +447,7 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { /// This implementation uses hybrid composition to render the Google Maps /// Widget on Android. This comes at the cost of some performance on Android /// versions below 10. See - /// https://github.com/flutter/flutter/wiki/Hybrid-Composition for more + /// https://flutter.dev/docs/development/platform-integration/platform-views#performance for more /// information. /// /// Defaults to false. From 8c6ac448831ab51b56876731b6c325736bead38d Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Tue, 8 Jun 2021 15:35:27 -0700 Subject: [PATCH 11/13] make text direction optional --- .../method_channel_google_maps_flutter.dart | 8 ++++++-- .../platform_interface/google_maps_flutter_platform.dart | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) 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 67c22cacb9e9..66749665901a 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 @@ -458,7 +458,7 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { int creationId, PlatformViewCreatedCallback onPlatformViewCreated, { required CameraPosition initialCameraPosition, - required TextDirection textDirection, + TextDirection? textDirection, Set markers = const {}, Set polygons = const {}, Set polylines = const {}, @@ -478,6 +478,10 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { }; if (defaultTargetPlatform == TargetPlatform.android && useAndroidViewSurface) { + assert( + textDirection != null, + 'textDirection must not be null when MethodChannelGoogleMapsFlutter.useAndroidViewSurface is set to true.', + ); return PlatformViewLink( viewType: 'plugins.flutter.io/google_maps', surfaceFactory: ( @@ -496,7 +500,7 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { PlatformViewsService.initSurfaceAndroidView( id: params.id, viewType: 'plugins.flutter.io/google_maps', - layoutDirection: textDirection, + layoutDirection: textDirection!, creationParams: creationParams, creationParamsCodec: const StandardMessageCodec(), onFocus: () => params.onFocusChanged(true), 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 152b49b30c3f..85a6d569d97e 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 @@ -343,7 +343,7 @@ abstract class GoogleMapsFlutterPlatform extends PlatformInterface { int creationId, PlatformViewCreatedCallback onPlatformViewCreated, { required CameraPosition initialCameraPosition, - required TextDirection textDirection, + TextDirection? textDirection, Set markers = const {}, Set polygons = const {}, Set polylines = const {}, From 35f1ec12bd869eaa5b0724be666fcf20cbc7b571 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 11 Jun 2021 13:38:48 -0700 Subject: [PATCH 12/13] create new build method for text direction --- .../method_channel_google_maps_flutter.dart | 76 ++++++++++++++----- .../google_maps_flutter_platform.dart | 1 - 2 files changed, 58 insertions(+), 19 deletions(-) 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 0061ba9472f7..41aedc759b15 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 @@ -450,15 +450,22 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { /// https://flutter.dev/docs/development/platform-integration/platform-views#performance for more /// information. /// + /// If set to true, the google map widget should be built with + /// [buildViewWithTextDirection] instead of [buildView]. + /// /// Defaults to false. bool useAndroidViewSurface = false; - @override - Widget buildView( + /// 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. + Widget buildViewWithTextDirection( int creationId, PlatformViewCreatedCallback onPlatformViewCreated, { required CameraPosition initialCameraPosition, - TextDirection? textDirection, + required TextDirection textDirection, Set markers = const {}, Set polygons = const {}, Set polylines = const {}, @@ -467,21 +474,17 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { Set>? gestureRecognizers, Map mapOptions = const {}, }) { - final Map creationParams = { - 'initialCameraPosition': initialCameraPosition.toMap(), - 'options': mapOptions, - 'markersToAdd': serializeMarkerSet(markers), - 'polygonsToAdd': serializePolygonSet(polygons), - 'polylinesToAdd': serializePolylineSet(polylines), - 'circlesToAdd': serializeCircleSet(circles), - 'tileOverlaysToAdd': serializeTileOverlaySet(tileOverlays), - }; if (defaultTargetPlatform == TargetPlatform.android && useAndroidViewSurface) { - assert( - textDirection != null, - 'textDirection must not be null when MethodChannelGoogleMapsFlutter.useAndroidViewSurface is set to true.', - ); + final Map creationParams = { + '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: ( @@ -500,7 +503,7 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { PlatformViewsService.initSurfaceAndroidView( id: params.id, viewType: 'plugins.flutter.io/google_maps', - layoutDirection: textDirection!, + layoutDirection: textDirection, creationParams: creationParams, creationParamsCodec: const StandardMessageCodec(), onFocus: () => params.onFocusChanged(true), @@ -516,7 +519,44 @@ class MethodChannelGoogleMapsFlutter extends GoogleMapsFlutterPlatform { return controller; }, ); - } else if (defaultTargetPlatform == TargetPlatform.android) { + } + 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 markers = const {}, + Set polygons = const {}, + Set polylines = const {}, + Set circles = const {}, + Set tileOverlays = const {}, + Set>? gestureRecognizers, + Map mapOptions = const {}, + }) { + final Map creationParams = { + 'initialCameraPosition': initialCameraPosition.toMap(), + 'options': mapOptions, + 'markersToAdd': serializeMarkerSet(markers), + 'polygonsToAdd': serializePolygonSet(polygons), + 'polylinesToAdd': serializePolylineSet(polylines), + 'circlesToAdd': serializeCircleSet(circles), + 'tileOverlaysToAdd': serializeTileOverlaySet(tileOverlays), + }; + if (defaultTargetPlatform == TargetPlatform.android) { return AndroidView( viewType: 'plugins.flutter.io/google_maps', onPlatformViewCreated: onPlatformViewCreated, 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 85a6d569d97e..425e040ee812 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 @@ -343,7 +343,6 @@ abstract class GoogleMapsFlutterPlatform extends PlatformInterface { int creationId, PlatformViewCreatedCallback onPlatformViewCreated, { required CameraPosition initialCameraPosition, - TextDirection? textDirection, Set markers = const {}, Set polygons = const {}, Set polylines = const {}, From a2b0483c6e1ee42ad1d60d18ee282cc41908fe82 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Mon, 14 Jun 2021 13:23:46 -0700 Subject: [PATCH 13/13] empty commit