{"id":32285075,"url":"https://github.com/saytoonz/flutter_place_picker","last_synced_at":"2026-02-23T10:35:32.290Z","repository":{"id":57750562,"uuid":"525703307","full_name":"saytoonz/flutter_place_picker","owner":"saytoonz","description":"Place picker for Flutter using open street, Here maps and google map","archived":false,"fork":false,"pushed_at":"2023-03-13T11:05:38.000Z","size":6681,"stargazers_count":17,"open_issues_count":1,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-26T16:50:47.672Z","etag":null,"topics":["flutter","flutter-place-picker","free","google","google-maps","google-maps-api","google-places-api","google-places-autocomplete-api","here-maps-api","heremaps","less-cost","open","open-street","openstreetmap","openstreetmap-api","place-picker","places","street"],"latest_commit_sha":null,"homepage":"https://pub.dev/packages/flutter_place_picker","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/saytoonz.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-08-17T08:28:54.000Z","updated_at":"2024-07-17T08:41:12.000Z","dependencies_parsed_at":"2025-03-30T09:30:53.559Z","dependency_job_id":null,"html_url":"https://github.com/saytoonz/flutter_place_picker","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/saytoonz/flutter_place_picker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saytoonz%2Fflutter_place_picker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saytoonz%2Fflutter_place_picker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saytoonz%2Fflutter_place_picker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saytoonz%2Fflutter_place_picker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/saytoonz","download_url":"https://codeload.github.com/saytoonz/flutter_place_picker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saytoonz%2Fflutter_place_picker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29741155,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-23T07:44:07.782Z","status":"ssl_error","status_checked_at":"2026-02-23T07:44:07.432Z","response_time":90,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flutter","flutter-place-picker","free","google","google-maps","google-maps-api","google-places-api","google-places-autocomplete-api","here-maps-api","heremaps","less-cost","open","open-street","openstreetmap","openstreetmap-api","place-picker","places","street"],"created_at":"2025-10-23T01:42:37.043Z","updated_at":"2026-02-23T10:35:32.272Z","avatar_url":"https://github.com/saytoonz.png","language":"Dart","funding_links":["https://www.buymeacoffee.com/saytoonz"],"categories":[],"sub_categories":[],"readme":"# Flutter Place Picker\n\nA Flutter plugin which provides 'Picking Place' using [Open Street](https://www.openstreetmap.org/), [Here Maps](https://www.here.com/) and [Google Maps](https://developers.google.com/maps/) widget.\n\n\nMuch thanks to  [Terry Kwon](https://github.com/fysoul17)   \n\nThe project relies on below packages.\n\nMap using Flutter's official [google_maps_flutter](https://pub.dev/packages/google_maps_flutter)   \nFetching current location using Baseflow's [geolocator](https://pub.dev/packages/geolocator)   \nPlace and Geocoding API using hadrienlejard's [google_maps_webservice](https://pub.dev/packages/google_maps_webservice)   \nBuilder using kevmoo's [tuple](https://pub.dev/packages/tuple)   \n\nThe package comes along with Laravel(PHP Framework) server which you can host for on your own. [Link to serve repository here...](https://github.com/saytoonz/saved-maps)\n\n## Preview\n![](preview.gif)\n\n## Support\nIf the package was useful or saved your time, please do not hesitate to buy me a cup of coffee! ;)  \nThe more caffeine I get, the more useful projects I can make in the future. \n\n\u003ca href=\"https://www.buymeacoffee.com/saytoonz\" target=\"_blank\"\u003e\u003cimg src=\"https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png\" alt=\"Buy Me A Coffee\" style=\"height: 41px !important;width: 174px !important;box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;-webkit-box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;\" \u003e\u003c/a\u003e\n\n## Getting Started\n\n* Get an API key at \u003chttps://cloud.google.com/maps-platform/\u003e.\n\n* Enable Google Map SDK for each platform.\n  * Go to [Google Developers Console](https://console.cloud.google.com/).\n  * Choose the project that you want to enable Google Maps on.\n  * Select the navigation menu and then select \"Google Maps\".\n  * Select \"APIs\" under the Google Maps menu.\n  * To enable Google Maps for Android, select \"Maps SDK for Android\" in the \"Additional APIs\" section, then select \"ENABLE\".\n  * To enable Google Maps for iOS, select \"Maps SDK for iOS\" in the \"Additional APIs\" section, then select \"ENABLE\".\n  * Make sure the APIs you enabled are under the \"Enabled APIs\" section.\n\n* You can also find detailed steps to get started with Google Maps Platform [here](https://developers.google.com/maps/gmp-get-started).\n\n### Android\n\nSpecify your API key in the application manifest `android/app/src/main/AndroidManifest.xml`:\n\n```xml\n\u003cmanifest ...\n  \u003capplication ...\n    \u003cmeta-data android:name=\"com.google.android.geo.API_KEY\"\n               android:value=\"YOUR KEY HERE\"/\u003e\n```\n\n\u003e **NOTE:** As of version 3.0.0 the geolocator plugin switched to the AndroidX version of the Android Support Libraries. This means you need to make sure your Android project is also upgraded to support AndroidX. Detailed instructions can be found [here](https://flutter.dev/docs/development/packages-and-plugins/androidx-compatibility). \n\u003e\n\u003eThe TL;DR version is:\n\u003e\n\u003e1. Add the following to your \"gradle.properties\" file:\n\u003e\n\u003e```\n\u003eandroid.useAndroidX=true\n\u003eandroid.enableJetifier=true\n\u003e```\n\u003e2. Make sure you set the `compileSdkVersion` in your \"android/app/build.gradle\" file to 28:\n\u003e\n\u003e```\n\u003eandroid {\n\u003e  compileSdkVersion 28\n\u003e\n\u003e  ...\n\u003e}\n\u003e```\n\u003e3. Make sure you replace all the `android.` dependencies to their AndroidX counterparts (a full list can be found here: https://developer.android.com/jetpack/androidx/migrate).\n\n### iOS\n\nSpecify your API key in the application delegate `ios/Runner/AppDelegate.m`:\n\n```objectivec\n#include \"AppDelegate.h\"\n#include \"GeneratedPluginRegistrant.h\"\n#import \"GoogleMaps/GoogleMaps.h\"\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application\n    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n  [GMSServices provideAPIKey:@\"YOUR KEY HERE\"];\n  [GeneratedPluginRegistrant registerWithRegistry:self];\n  return [super application:application didFinishLaunchingWithOptions:launchOptions];\n}\n@end\n```\n\nOr in your swift code, specify your API key in the application delegate `ios/Runner/AppDelegate.swift`:\n\n```swift\nimport UIKit\nimport Flutter\nimport GoogleMaps\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?\n  ) -\u003e Bool {\n    GMSServices.provideAPIKey(\"YOUR KEY HERE\")\n    GeneratedPluginRegistrant.register(with: self)\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n}\n```\n\nOn iOS you'll need to add the following entries to your Info.plist file (located under ios/Runner) in order to access the device's location. \n\nSimply open your Info.plist file and add the following:\n\n``` xml\n\u003ckey\u003eNSLocationWhenInUseUsageDescription\u003c/key\u003e\n\u003cstring\u003eThis app needs access to location when open.\u003c/string\u003e\n\u003ckey\u003eNSLocationAlwaysUsageDescription\u003c/key\u003e\n\u003cstring\u003eThis app needs access to location when in the background.\u003c/string\u003e\n\u003ckey\u003eNSLocationAlwaysAndWhenInUseUsageDescription\u003c/key\u003e\n\u003cstring\u003eThis app needs access to location when open and in the background.\u003c/string\u003e\n```\n\nIn addition, you need to add the `Background Modes` capability to your XCode project (Project \u003e Signing and Capabilties \u003e \"+ Capability\" button) and select `Location Updates`.g\u003eThis app needs access to location when open and in the background.\u003c/string\u003e\n\nOpt-in to the embedded views preview by adding a boolean property to the app's `Info.plist` file\nwith the key `io.flutter.embedded_views_preview` and the value `YES`.\n\n```xml\n\u003ckey\u003eio.flutter.embedded_views_preview\u003c/key\u003e\n\u003ctrue/\u003e\n```\n## Usage\n\n### Basic usage\n\nYou can use PlacePicker by pushing to a new page using Navigator, OR put as a child of any widget.  \nWhen the user picks a place on the map, it will return result to 'onPlacePicked' with PickResult type.\nAlternatively, you can build your own way with 'selectedPlaceWidgetBuilder' and fetch result from it (See the instruction below).\n\n```dart\nNavigator.push(\n      context,\n      MaterialPageRoute(\n        builder: (context) =\u003e FlutterPlacePicker(\n          apiKey: APIKeys.apiKey,   // Put YOUR OWN KEY here.\n          onPlacePicked: (result) { \n            Navigator.of(context).pop();\n          },\n          initialPosition: HomePage.kInitialPosition,\n          useCurrentLocation: true,\n        ),\n      ),\n    );\n```\n\n#### PickResult \nParameter | Type | Description\n--------- | ---- | -----------\nplaceId | String | A textual identifier that uniquely identifies a place. To retrieve information about the place, pass this identifier in the placeId field of a Places API request. See [PlaceId](https://developers.google.com/places/web-service/place-id) for more information.\ngeometry | Geometry | Contains geometry information about the result, generally including the location (geocode) of the place and (optionally) the viewport identifying its general area of coverage.\nformattedAddress | String | A string containing the human-readable address of this place. Often this address is equivalent to the \"postal address\".\ntypes | List\\\u003cString\\\u003e | Contains an array of feature types describing the given result. See the [list of supported types](https://developers.google.com/places/web-service/supported_types#table2). XML responses include multiple \u003ctype\u003e elements if more than one type is assigned to the result.\naddressComponents | List\\\u003cAddressComponent\\\u003e | An array containing the separate components applicable to this address.\n  \n** Below results will be fetched only when using auto-complete search or usePlaceDetailSearch is set to true when searching by dragging the map.\n#### PickResult (Optional)\nParameter | Type | Description\n--------- | ---- | -----------\nadrAddress | String | A representation of the place's address in the [adr microformat](https://microformats.org/wiki/adr)\nformattedPhoneNumber | String | Contains the place's phone number in its [local format](https://en.wikipedia.org/wiki/Local_conventions_for_writing_telephone_numbers)\nid | String | ? (Not documented at Google - see more info below)\nreference | String | ? (Not documented at Google - see more info below)\nicon | String | The URL of a suggested icon which may be displayed to the user when indicating this result on a map.\nname | String | Human-readable name for the returned result\nopeningHours | OpeningHoursDetail | Opening hour information\nphotos | List\\\u003cPhoto\\\u003e | Array of photo objects, each containing a reference to an image\ninternationalPhoneNumber | String | The place's phone number in international format\npriceLevel | PriceLevel | The price level of the place, on a scale of 0 to 4. The exact amount indicated by a specific value will vary from region to region.\nrating | num | The place's rating, from 1.0 to 5.0, based on aggregated user reviews.\nscope | String |\nurl | String | The URL of the official Google page for this place. \nvicinity | String | Lists a simplified address for the place, including the street name, street number, and locality, but not the province/state, postal code, or country\nutcOffset | num | The number of minutes this place’s current timezone is offset from UTC\nwebsite | String | The authoritative website for this place\nreviews | List\\\u003cReview\\\u003e | JSON array of up to five reviews\n\n[More info](https://developers.google.com/places/web-service/details) about results at Google document.\n\n#### PlacePicker\nParameter | Type | Description\n--------- | ---- | -----------\napiKey | String | (Required) Your google map API Key\nserverUrl | String | Your host server url (eg. https://www.your-server.com/api/). Null or empty serverUrl uses our fallback Url (phplaravel-641695-2829489.cloudwaysapps.com/api/)\nonPlacePicked | Callback(PickResult) | Invoked when user picks the place and selects to use it. **This will not be called if you manually build 'selectedPlaceWidgetBuilder' as you will override default 'Select here' button.**\ninitialPosition | LatLng | (Required) Initial center position of google map when it is created. If useCurrentLocation is set to true, it will try to get device's current location first using GeoLocator. \nuseCurrentLocation | bool | Whether to use device's current location for initial center position. This will be used instead of initial position when it is set to true AND user ALLOW to collect their location. If DENIED, initialPosition will be used.\ndesiredLocationAccuracy | [LocationAccuracy](https://pub.dev/packages/geolocator) | Accuracy of fetching current location. Defaults to 'high'.\nhintText | String | Hint text of search bar\nsearchingText | String | A text which appears when searching is performing. Default to 'Searching...'\nproxyBaseUrl | String | Used for API calling on google maps. In case of using a proxy the baseUrl can be set. The apiKey is not required in case the proxy sets it.\nhttpClient | [Client](https://pub.dev/packages/google_maps_webservice) | Used for API calling on google maps. In case of using a proxy url that requires authentication or custom configuration.\nautoCompleteDebounceInMilliseconds | int | Debounce timer for auto complete input. Default to 500\ncameraMoveDebounceInMilliseconds | int | Debounce timer for searching place with camera(map) dragging. Defaults to 750\nintialMapType | MapType | MapTypes of google map. Defaults to normal.\nenableMapTypeButton | bool | Whether to display MapType change button on the map\nenableMyLocationButton | bool | Whether to display my location button on the map\nusePinPointingSearch | bool | Defaults to true. This will allow user to drag map and get a place info where the pin is pointing.\nusePlaceDetailSearch | bool | Defaults to false. Setting this to true will get detailed result from searching by dragging the map, but will use +1 request on Place Detail API.\nonAutoCompleteFailed | Callback(String) | Invoked when auto complete search is failed\nonGeocodingSearchFailed | Callback(String) | Invoked when searching place by dragging the map failed\nonMapCreated | MapCreatedCallback | Returns google map controller when created\nselectedPlaceWidgetBuilder | WidgetBuilder | Specified on below section\npinBuilder | WidgetBuilder | Specified on below section\nautocompleteOffset | num | The position, in the input term, of the last character that the service uses to match predictions\nautocompleteRadius | num | The distance (in meters) within which to return place results\nautocompleteLanguage | String | The [language code](https://developers.google.com/maps/faq#languagesupport), indicating in which language the results should be returned, if possible. \nautocompleteComponents | List\\\u003cComponents\\\u003e | A grouping of places to which you would like to restrict your results. Currently, you can use components to filter by up to 5 countries.\nautocompleteTypes | List\\\u003cString\\\u003e | The types of place results to return. See [Place Types](https://developers.google.com/places/web-service/autocomplete#place_types).\nstrictBounds | bool | Returns only those places that are strictly within the region defined by location and radius.\nregion | String | region — The region code, specified as a ccTLD (country code top-level domain) two-character value. Most ccTLD codes are identical to ISO 3166-1 codes, with some exceptions. This parameter will only influence, not fully restrict, search results. If more relevant results exist outside of the specified region, they may be included. **When this parameter is used, the country name is omitted from the resulting formatted_address for results in the specified region.**\nselectInitialPosition | bool | Whether to display selected place on initial map load. Defaults to false.\nresizeToAvoidBottomInset | bool | Refer to Scaffold's resizeToAvoidBottomInset property.\ninitialSearchString | String | Sets initial search string for auto complete search\nsearchForInitialValue | bool | Wether to automatically search for initial value on start\nforceAndroidLocationManager | bool | On Android devices you can set this to true to force the geolocator plugin to use the 'LocationManager' to determine the position instead of the 'FusedLocationProviderClient'. On iOS this is ignored.\nmyLocationButtonCooldown | int | Cooldown time in seconds for the 'myLocationButton'. Defaults to 10 seconds. \nforceSearchOnZoomChanged | bool | Wether to allow place search even when the zoom has changed. Defaults to false.\nautomaticallyImplyAppBarLeading | bool | By default, there is a back button on the top. Setting false will remove the back button.\nautocompleteOnTrailingWhitespace | bool | Whether to allow autocomplete to run even on whitespace at the end of the search. Defaults to false. Issue ref #54.\n\n[More info](https://developers.google.com/places/web-service/autocomplete) about autocomplete search at Google document.\n\n### Customizing picked place visualisation\n\nBy default, when a user picks a place by using auto complete search or dragging the map, we display the information at the bottom of the screen (FloatingCard).  \n\nHowever, if you don't like this UI/UX, simply override the builder using 'selectedPlaceWidgetBuilder'. FlocatingCard widget can be reused which is floating around the screen or build an entirely new widget as you want. It is stacked with the map, so you might want to use the [Positioned](https://api.flutter.dev/flutter/widgets/Positioned-class.html) widget.\n\n**Note that using this customization WILL NOT INVOKE [onPlacePicked] callback as it will override default 'Select here' button on floating card**\n\n```dart\n...\nPlacePicker(apiKey: APIKeys.apiKey,\n            ...\n            selectedPlaceWidgetBuilder: (_, selectedPlace, state, isSearchBarFocused) {\n              return isSearchBarFocused\n                  ? Container()\n                  // Use FloatingCard or just create your own Widget.\n                  : FloatingCard(\n                      bottomPosition: 0.0,    // MediaQuery.of(context) will cause rebuild. See MediaQuery document for the information.\n                      leftPosition: 0.0,\n                      rightPosition: 0.0,\n                      width: 500,\n                      borderRadius: BorderRadius.circular(12.0),\n                      child: state == SearchingState.Searching ? \n                                      Center(child: CircularProgressIndicator()) : \n                                      RaisedButton(onPressed: () { print(\"do something with [selectedPlace] data\"); },),\n                   );\n            },\n            ...\n          ),\n...\n```\nParameters | Type | Description\n---------- | ---- | -----------\ncontext | BuildContext | Flutter's build context value\nselectedPlace | PickResult | Result data of user selected place\nstate | SearchingState | State of searching action. (Idle, Searching)\nisSearchBarFocused | bool | Whether the search bar is currently focused so the keyboard is shown\n\n### Customizing Pin\nBy default, Pin icon is provided with very simple picking animation when moving around.   \nHowever, you can also create your own pin widget using 'pinBuilder'\n\n```dart\nFlutterPlacePicker(apiKey: APIKeys.apiKey,\n            ...\n            pinBuilder: (context, state) {\n                  if (state == PinState.Idle) {\n                    return Icon(Icons.favorite_border);\n                  } else {\n                    return AnimatedIcon(.....);\n                  }\n                },\n            ...                        \n          ),\n...\n```\n\nParameters | Type | Description\n---------- | ---- | -----------\ncontext | BuildContext | Flutter's build context value\nstate | PinState | State of pin. (Preparing; When map loading, Idle, Dragging)\n\n### Changing Colours of default FloatingCard\nWhile you can build your own prediction tile, you still can change the style of default tile using themeData as below:\n\n```dart\n// Light Theme\nfinal ThemeData lightTheme = ThemeData.light().copyWith(\n  // Background color of the FloatingCard\n  cardColor: Colors.white,\n  buttonTheme: ButtonThemeData(\n    // Select here's button color\n    buttonColor: Colors.black,\n    textTheme: ButtonTextTheme.primary,\n  ),\n);\n\n// Dark Theme\nfinal ThemeData darkTheme = ThemeData.dark().copyWith(\n  // Background color of the FloatingCard\n  cardColor: Colors.grey,\n  buttonTheme: ButtonThemeData(\n    // Select here's button color\n    buttonColor: Colors.yellow,\n    textTheme: ButtonTextTheme.primary,\n  ),\n);\n```\n\n![](screenshot2.png)\n\n## Feature Requests and Issues\nPlease file feature requests and bugs at the [issue tracker][tracker].\n\n[tracker]: https://github.com/saytoonz/flutter_place_picker/issues/new\n\n\n\u003ca href=\"https://www.buymeacoffee.com/saytoonz\" target=\"_blank\"\u003e\u003cimg src=\"https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png\" alt=\"Buy Me A Coffee\" style=\"height: 41px !important;width: 174px !important;box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;-webkit-box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;\" \u003e\u003c/a\u003e\n\n\n## Connect with me\n[\u003cimg align=\"left\" alt=\"Sam | Twitter\" width=\"22px\" src=\"https://cdn.jsdelivr.net/npm/simple-icons@v3/icons/twitter.svg\" /\u003e](https://twitter.com/saytoonz)\n[\u003cimg align=\"left\" alt=\"Sam | LinkedIn\" width=\"22px\" src=\"https://cdn.jsdelivr.net/npm/simple-icons@v3/icons/linkedin.svg\" /\u003e](https://www.linkedin.com/in/samuel-annin-yeboah-427564142/)\n[\u003cimg align=\"left\" alt=\"Sam | Instagram\" width=\"22px\" src=\"https://cdn.jsdelivr.net/npm/simple-icons@v3/icons/instagram.svg\" /\u003e](https://instagram.com/saytoonz)\n\n\n###\n## Visitors Count\n\u003cimg align=\"left\" src = \"https://profile-counter.glitch.me/flutter_place_picker/count.svg\" alt =\"Loading\"\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaytoonz%2Fflutter_place_picker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsaytoonz%2Fflutter_place_picker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaytoonz%2Fflutter_place_picker/lists"}