google_place_api
A Flutter plugin for iOS and Android and Web that provides a Google Place API. This package is forked from bazrafkan, appreciate your contribution.
Preview
The Places API is a service that returns information about places using HTTP requests. Places are defined within this API as establishments, geographic locations, or prominent points of interest.
The following place requests are available:
- Place Search returns a list of places based on a user's location or search string.
- Place Details returns more detailed information about a specific place, including user reviews.
- Place Photos provides access to the millions of place-related photos stored in Google's Place database.
- Place Autocomplete automatically fills in the name and/or address of a place as users type.
- Query Autocomplete provides a query prediction service for text-based geographic searches, returning suggested queries as users type.
Usage
To use this plugin, add google_place_api as a dependency in your pubspec.yaml file.
Getting Started
- Get an API key at https://cloud.google.com/maps-platform/.
- Go to Google Developers Console.
- Choose the project that you want to enable Google Place on.
Example
Sample Usage
- Place Autocomplete
var googlePlace = GooglePlace("Your-Key");
var result = await googlePlace.autocomplete.get("1600 Amphitheatre");
- Place Query Autocomplete
var googlePlace = GooglePlace("Your-Key");
var result = await googlePlace.queryAutocomplete.get("pizza near sydne");
- Place Photos
var googlePlace = GooglePlace("Your-Key");
Uint8List result = await googlePlace.photos.get(
"CnRtAAAATLZNl354RwP_9UKbQ_5Psy40texXePv4oAlgP4qNEkdIrkyse7rPXYGd9D_Uj1rVsQdWT4oRz4QrYAJNpFX7rzqqMlZw2h2E2y5IKMUZ7ouD_SlcHxYq1yL4KbKUv3qtWgTK0A6QbGh87GB3sscrHRIQiG2RrmU_jF4tENr9wGS_YxoUSSDrYjWmrNfeEHSGSc3FyhNLlBU", null, 400);
- Place Details
var googlePlace = GooglePlace("Your-Key");
Uint8List result = await googlePlace.details.get("ChIJN1t_tDeuEmsRUsoyG83frY4",
fields: "name,rating,formatted_phone_number")
-
Place Search
-
Find Place
var googlePlace = GooglePlace("Your-Key"); var result = await googlePlace.search.getFindPlace( "Museum of Contemporary Art Australia", InputType.TextQuery); -
Nearby Search
var googlePlace = GooglePlace("Your-Key"); var result = await googlePlace.search.getNearBySearch( Location(lat: -33.8670522, lng: 151.1957362), 1500, type: "restaurant", keyword: "cruise"); -
Text Search
var googlePlace = GooglePlace("Your-Key"); var result = await googlePlace.search.getTextSearch("restaurants in Sydney");
-
Custom Headers
Now is possible to set custom header to use platform-specific API keys where you must provide the following headers.
final headers = <String, String>{
if (defaultTargetPlatform == TargetPlatform.iOS)
'x-ios-bundle-identifier': Env().bundleIdentifier, // com.my.app
if (defaultTargetPlatform == TargetPlatform.android) ...{
'x-android-package': Env().bundleIdentifier, // com.my.app
'x-android-cert': Env().ANDROID_SIGNING_KEY_SHA1, // signing key used to build/publish the app
}
};
var googlePlace = GooglePlace("Your-Key", headers: headers);
Proxy URL for Web
Now is possible to set proxy url for web. proxyUrl can be formatted as [https:// | http://]host[:port][/path][?url-param-name=]
var googlePlace = GooglePlace("Your-Key", proxyUrl: 'https://localhost:5000');
Backend REST Proxy
Route Google Places through a backend that injects the API key. The mobile app sends a JWT; no GOOGLE_API_KEY in the app.
final googlePlace = GooglePlace(
'',
headers: {
'Authorization': 'Bearer $jwt',
// ... app-specific headers
},
proxyConfig: PlacesProxyConfig(
mode: PlacesProxyMode.directRest,
proxyBaseUrl: 'https://api.test.example.net/api/v1/proxy/google/places',
),
httpClient: DioPlacesHttpClient(dio),
);
Requests are routed to clean REST paths:
GET .../autocomplete?input=...GET .../details?place_id=...GET .../search?query=...GET .../nearby?location=...GET .../find?input=...
The key query parameter is stripped in directRest mode (backend injects it). No url= forwarder param.
URI priority: uriBuilder > proxyConfig.directRest > proxyUrl forwarder > direct Google API.
Injectable HTTP Client (Dio)
By default the package uses package:http. Pass a custom PlacesHttpClient to use Dio (JWT interceptors, SSL pinning, logging, etc.). Dio is not a dependency of this package — implement the adapter in your app:
class DioPlacesHttpClient implements PlacesHttpClient {
final Dio _dio;
DioPlacesHttpClient(this._dio);
@override
Future<PlacesHttpResponse> get(
Uri uri, {
Map<String, String>? headers,
Duration? timeout,
}) async {
final response = await _dio.getUri(
uri,
options: Options(
headers: headers,
responseType: ResponseType.plain,
sendTimeout: timeout,
receiveTimeout: timeout,
),
);
return PlacesHttpResponse(
statusCode: response.statusCode ?? 0,
body: response.data as String,
);
}
}
GooglePlace.timeout applies to all HTTP clients.
Custom URI Builder
For non-standard backend paths, provide a PlacesUriBuilder:
GooglePlace(
'',
uriBuilder: ({
required PlacesOperation operation,
required Map<String, String?> queryParameters,
}) {
// build Uri for your backend
},
);
