-
Notifications
You must be signed in to change notification settings - Fork 9.7k
Support Hybrid Composition through the GoogleMaps Widget #4082
Changes from 4 commits
b17d1dc
82c4614
7b6f801
736c073
f6631b4
50b548e
944d965
e345f3a
1809e66
f504ffc
be87b94
cf87583
d907845
58c3028
0c26d6c
86f965c
35a8186
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -46,6 +46,19 @@ This means that app will only be available for users that run Android SDK 20 or | |
android:value="YOUR KEY HERE"/> | ||
``` | ||
|
||
#### Hybrid Composition | ||
|
||
To use Hybrid Composition to render the `GoogleMap` widget on Android. Set the | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nit: maybe link "Hybrid Composition" to an explanation of what that is for people who don't know? |
||
`MethodChannelGoogleMapsFlutter.useAndroidViewSurface` to true. | ||
bparrishMines marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
```dart | ||
if (defaultTargetPlatform == TargetPlatform.android) { | ||
final MethodChannelGoogleMapsFlutter platform = | ||
GoogleMapsFlutterPlatform.instance as MethodChannelGoogleMapsFlutter; | ||
platform.useAndroidViewSurface = true; | ||
} | ||
``` | ||
|
||
### iOS | ||
|
||
Specify your API key in the application delegate `ios/Runner/AppDelegate.m`: | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,9 @@ | |
|
||
// ignore_for_file: public_member_api_docs | ||
|
||
import 'package:flutter/foundation.dart'; | ||
import 'package:flutter/material.dart'; | ||
import 'package:google_maps_flutter/google_maps_flutter.dart'; | ||
import 'package:google_maps_flutter_example/lite_mode.dart'; | ||
import 'animate_camera.dart'; | ||
import 'map_click.dart'; | ||
|
@@ -66,5 +68,11 @@ class MapsDemo extends StatelessWidget { | |
} | ||
|
||
void main() { | ||
WidgetsFlutterBinding.ensureInitialized(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why is this necessary? Setting that flag doesn't send a message, does it? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You're right. Force of habit. removed |
||
if (defaultTargetPlatform == TargetPlatform.android) { | ||
final MethodChannelGoogleMapsFlutter platform = | ||
GoogleMapsFlutterPlatform.instance as MethodChannelGoogleMapsFlutter; | ||
platform.useAndroidViewSurface = true; | ||
} | ||
runApp(MaterialApp(home: MapsDemo())); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -61,6 +61,7 @@ class GoogleMap extends StatefulWidget { | |
this.tiltGesturesEnabled = true, | ||
this.myLocationEnabled = false, | ||
this.myLocationButtonEnabled = true, | ||
this.textDirection, | ||
|
||
/// If no padding is specified default padding will be 0. | ||
this.padding = const EdgeInsets.all(0), | ||
|
@@ -100,6 +101,13 @@ class GoogleMap extends StatefulWidget { | |
/// Type of map tiles to be rendered. | ||
final MapType mapType; | ||
|
||
/// {@template flutter.widgets.AndroidView.layoutDirection} | ||
/// The text direction to use for the embedded view. | ||
/// | ||
/// If this is null, the ambient [Directionality] is used instead. | ||
/// {@endtemplate} | ||
final TextDirection? textDirection; | ||
|
||
/// Preferred bounds for the camera zoom level. | ||
/// | ||
/// Actual bounds depend on map data and device. | ||
|
@@ -250,7 +258,23 @@ class _GoogleMapState extends State<GoogleMap> { | |
|
||
@override | ||
Widget build(BuildContext context) { | ||
return GoogleMapsFlutterPlatform.instance.buildView( | ||
final GoogleMapsFlutterPlatform platform = | ||
GoogleMapsFlutterPlatform.instance; | ||
if (platform is MethodChannelGoogleMapsFlutter) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why can't the new method be called unconditionally? The delegation to the old method was supposed to be handled by a default implementation in the platform interface. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The default implementation ( So in this case, we would need to call the other method, right? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sorry, that was poorly phrased; by "default implementation" I mean the code that's part of the base class that all implementations extend from. Having a fallback implementation there is what makes this overall change harmless even for federated implementations we don't even know about. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah ok. So buildViewWithTextDirection was only added to Were you thinking that There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That was what I had intended in the discussion, yes. However, IIRC there was discussion of this being temporary, in which case I'm okay with this approach if you don't want to go back and make another change to the platform interface given that it's already been done. (If this were permanent, it would be more important that we not embed implementation-specific code here as much as possible.) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For this method to only be temporary, the platform_interface would have to be broken and bumped to version 3.0. This is because any implementation would need to add the additional parameter to their method. However, I believe the policy is to avoid breaking changes to the platform_interface. An alternative is to have two methods, and to call This PR essentially makes There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
That's why I had recommended having the method not throw UnimplementedError, but instead calling the old method. But my question wasn't about implemented, but the ideal goal: do we want this new parameter forever, or is the need for this parameter temporary? I had thought it was the latter, but again, I may have misunderstood. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah, you wanted that done at the interface level and not the implementation level. That makes since. This parameter is required for Android hybrid composition unless we don't want the user to be able to change the text direction. I haven't seen a way around it yet that doesn't involve framework changes. My intention is that it's a permanent parameter. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Okay, sorry for the confusion on my part about the intended lifespan. In that case yes, I think we should update the platform interface to have a default implementation that calls the old method with a default value. Then implementations (those that want a different behavior than that default) can override both, but nobody will be broken and the details of who implements what won't bleed into this package. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That works for me! I updated #4121 to reflect this. |
||
return platform.buildViewWithTextDirection( | ||
_mapId, | ||
onPlatformViewCreated, | ||
textDirection: widget.textDirection ?? Directionality.of(context), | ||
initialCameraPosition: widget.initialCameraPosition, | ||
markers: widget.markers, | ||
polygons: widget.polygons, | ||
polylines: widget.polylines, | ||
circles: widget.circles, | ||
gestureRecognizers: widget.gestureRecognizers, | ||
mapOptions: _googleMapOptions.toMap(), | ||
); | ||
} | ||
return platform.buildView( | ||
_mapId, | ||
onPlatformViewCreated, | ||
initialCameraPosition: widget.initialCameraPosition, | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: s/. Set the/, set/