You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

251 lines
9.9 KiB

import 'package:flutter/material.dart';
import 'package:google_maps_place_picker_mb/google_maps_place_picker.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'dart:io' show Platform;
import 'package:google_maps_flutter_android/google_maps_flutter_android.dart';
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';
class GooglePlacePicker extends StatefulWidget {
GooglePlacePicker({Key? key}) : super(key: key);
static final kInitialPosition = LatLng(17.4167312, 78.4519109);
final GoogleMapsFlutterPlatform mapsImplementation =
GoogleMapsFlutterPlatform.instance;
@override
State<GooglePlacePicker> createState() => _GooglePlacePickerState();
}
class _GooglePlacePickerState extends State<GooglePlacePicker> {
PickResult? selectedPlace;
bool _showPlacePickerInContainer = false;
bool _showGoogleMapInContainer = false;
bool _mapsInitialized = false;
String _mapsRenderer = "latest";
void initRenderer() {
if (_mapsInitialized) return;
if (widget.mapsImplementation is GoogleMapsFlutterAndroid) {
switch (_mapsRenderer) {
case "legacy":
(widget.mapsImplementation as GoogleMapsFlutterAndroid)
.initializeWithRenderer(AndroidMapRenderer.legacy);
break;
case "latest":
(widget.mapsImplementation as GoogleMapsFlutterAndroid)
.initializeWithRenderer(AndroidMapRenderer.latest);
break;
}
}
setState(() {
_mapsInitialized = true;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Google Map Place Picker Demo"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (!_mapsInitialized &&
widget.mapsImplementation
is GoogleMapsFlutterAndroid) ...[
Switch(
value: (widget.mapsImplementation
as GoogleMapsFlutterAndroid)
.useAndroidViewSurface,
onChanged: (value) {
setState(() {
(widget.mapsImplementation
as GoogleMapsFlutterAndroid)
.useAndroidViewSurface = value;
});
}),
Text("Hybrid Composition"),
]
],
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (!_mapsInitialized &&
widget.mapsImplementation
is GoogleMapsFlutterAndroid) ...[
Text("Renderer: "),
Radio(
groupValue: _mapsRenderer,
value: "auto",
onChanged: (value) {
setState(() {
_mapsRenderer = "auto";
});
}),
Text("Auto"),
Radio(
groupValue: _mapsRenderer,
value: "legacy",
onChanged: (value) {
setState(() {
_mapsRenderer = "legacy";
});
}),
Text("Legacy"),
Radio(
groupValue: _mapsRenderer,
value: "latest",
onChanged: (value) {
setState(() {
_mapsRenderer = "latest";
});
}),
Text("Latest"),
]
],
),
!_showPlacePickerInContainer
? ElevatedButton(
child: Text("Load Place Picker"),
onPressed: () {
initRenderer();
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return PlacePicker(
resizeToAvoidBottomInset:
false, // only works in page mode, less flickery
apiKey: Platform.isAndroid
? "AIzaSyB4FhQFeC9JMeIadUwIO6HkoD4UFG6N-HM"
: "IOS API KEY",
hintText: "Find a place ...",
searchingText: "Please wait ...",
selectText: "Select place",
outsideOfPickAreaText: "Place not in area",
initialPosition: GooglePlacePicker.kInitialPosition,
useCurrentLocation: true,
selectInitialPosition: true,
usePinPointingSearch: true,
usePlaceDetailSearch: true,
zoomGesturesEnabled: true,
zoomControlsEnabled: true,
onMapCreated: (GoogleMapController controller) {
print("Map created");
},
onPlacePicked: (PickResult result) {
print(
"Place picked: ${result.formattedAddress}");
setState(() {
selectedPlace = result;
Navigator.of(context).pop();
});
},
onMapTypeChanged: (MapType mapType) {
print(
"Map type changed to ${mapType.toString()}");
},
);
},
),
);
},
)
: Container(),
!_showPlacePickerInContainer
? ElevatedButton(
child: Text("Load Place Picker in Container"),
onPressed: () {
initRenderer();
setState(() {
_showPlacePickerInContainer = true;
});
},
)
: Container(
width: MediaQuery.of(context).size.width * 0.75,
height: MediaQuery.of(context).size.height * 0.35,
child: PlacePicker(
forceAndroidLocationManager: true,
apiKey: Platform.isAndroid
? "AIzaSyB4FhQFeC9JMeIadUwIO6HkoD4UFG6N-HM"
: "IOS API KEY",
hintText: "Find a place ...",
searchingText: "Please wait ...",
selectText: "Select place",
initialPosition: GooglePlacePicker.kInitialPosition,
useCurrentLocation: true,
selectInitialPosition: true,
usePinPointingSearch: true,
usePlaceDetailSearch: true,
zoomGesturesEnabled: true,
zoomControlsEnabled: true,
onPlacePicked: (PickResult result) {
setState(() {
selectedPlace = result;
_showPlacePickerInContainer = false;
});
},
onTapBack: () {
setState(() {
_showPlacePickerInContainer = false;
});
})),
if (selectedPlace != null) ...[
Text(selectedPlace!.formattedAddress!),
Text("(lat: " +
selectedPlace!.geometry!.location.lat.toString() +
", lng: " +
selectedPlace!.geometry!.location.lng.toString() +
")"),
],
// #region Google Map Example without provider
_showPlacePickerInContainer
? Container()
: ElevatedButton(
child: Text("Toggle Google Map w/o Provider"),
onPressed: () {
initRenderer();
setState(() {
_showGoogleMapInContainer =
!_showGoogleMapInContainer;
});
},
),
!_showGoogleMapInContainer
? Container()
: Container(
width: MediaQuery.of(context).size.width * 0.75,
height: MediaQuery.of(context).size.height * 0.25,
child: GoogleMap(
zoomGesturesEnabled: false,
zoomControlsEnabled: false,
myLocationButtonEnabled: false,
compassEnabled: false,
mapToolbarEnabled: false,
initialCameraPosition: new CameraPosition(
target: GooglePlacePicker.kInitialPosition, zoom: 15),
mapType: MapType.normal,
myLocationEnabled: true,
onMapCreated: (GoogleMapController controller) {},
onCameraIdle: () {},
onCameraMoveStarted: () {},
onCameraMove: (CameraPosition position) {},
)),
!_showGoogleMapInContainer ? Container() : TextField(),
// #endregion
],
),
));
}
}