Un plugin Flutter qui fournit ‘Picking Place’ en utilisant Google Maps widget.
Le projet s’appuie sur les packages ci-dessous.
Carte utilisant l’officiel de Flutter google_maps_flutter
Récupération de l’emplacement actuel à l’aide de Baseflow géolocalisateur
API de lieu et de géocodage à l’aide de celle d’hadrienlejard google_maps_webservice
Constructeur utilisant kevmoo tuple
Aperçu
Soutien
Si le forfait vous a été utile ou vous a fait gagner du temps, n’hésitez pas à m’offrir une tasse de café ! 😉 Plus je consomme de caféine, plus je peux réaliser de projets utiles à l’avenir.
Commencer
-
Obtenez une clé API sur https://cloud.google.com/maps-platform/.
-
Activez Google Map SDK pour chaque plate-forme.
- Aller à Console des développeurs Google.
- Choisissez le projet sur lequel vous souhaitez activer Google Maps.
- Sélectionnez le menu de navigation puis sélectionnez « Google Maps ».
- Sélectionnez « API » dans le menu Google Maps.
- Pour activer Google Maps pour Android, sélectionnez « Maps SDK pour Android » dans la section « API supplémentaires », puis sélectionnez « ACTIVER ».
- Pour activer Google Maps pour iOS, sélectionnez « Maps SDK pour iOS » dans la section « API supplémentaires », puis sélectionnez « ACTIVER ».
- Assurez-vous que les API que vous avez activées se trouvent dans la section « API activées ».
-
Vous pouvez également trouver des étapes détaillées pour démarrer avec Google Maps Platform ici.
Android
Spécifiez votre clé API dans le manifeste de l’application android/app/src/main/AndroidManifest.xml
:
<manifest ...
<application ...
<meta-data android:name="com.google.android.geo.API_KEY"
android:value="YOUR KEY HERE"/>
REMARQUE: À partir de la version 3.0.0, le plug-in de géolocalisation est passé à la version AndroidX des bibliothèques de support Android. Cela signifie que vous devez vous assurer que votre projet Android est également mis à niveau pour prendre en charge AndroidX. Des instructions détaillées peuvent être trouvées ici.
La version TL; DR est :
- Ajoutez ce qui suit à votre fichier « gradle.properties »:
android.useAndroidX=true android.enableJetifier=true
- Assurez-vous de définir le
compileSdkVersion
dans votre fichier « android/app/build.gradle » à 28 :android { compileSdkVersion 28 ... }
- Assurez-vous de remplacer tous les
android.
dépendances à leurs homologues AndroidX (une liste complète peut être trouvée ici : https://developer.android.com/jetpack/androidx/migrate).
iOS
Spécifiez votre clé API dans le délégué de l’application ios/Runner/AppDelegate.m
:
#include "AppDelegate.h"
#include "GeneratedPluginRegistrant.h"
#import "GoogleMaps/GoogleMaps.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GMSServices provideAPIKey:@"YOUR KEY HERE"];
[GeneratedPluginRegistrant registerWithRegistry:self];
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end
Ou dans votre code Swift, spécifiez votre clé API dans le délégué de l’application ios/Runner/AppDelegate.swift
:
import UIKit
import Flutter
import GoogleMaps
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?
) -> Bool {
GMSServices.provideAPIKey("YOUR KEY HERE")
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
Sur iOS, vous devrez ajouter les entrées suivantes à votre fichier Info.plist (situé sous ios/Runner) afin d’accéder à l’emplacement de l’appareil.
Ouvrez simplement votre fichier Info.plist et ajoutez ce qui suit :
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs access to location when open.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>This app needs access to location when in the background.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This app needs access to location when open and in the background.</string>
De plus, vous devez ajouter le Background Modes
capacité à votre projet XCode (Projet> Signature et Capacités> bouton « + Capacité ») et sélectionnez Location Updates
.g>Cette application a besoin d’accéder à l’emplacement lorsqu’elle est ouverte et en arrière-plan.
Activez l’aperçu des vues intégrées en ajoutant une propriété booléenne à l’application Info.plist
fichier avec la clé io.flutter.embedded_views_preview
et la valeur YES
.
<key>io.flutter.embedded_views_preview</key>
<true/>
Usage
Utilisation de base
Vous pouvez utiliser PlacePicker en poussant vers une nouvelle page à l’aide de Navigator, OU en tant qu’enfant de n’importe quel widget. Lorsque l’utilisateur choisit un lieu sur la carte, il renverra le résultat à ‘onPlacePicked’ avec le type PickResult. Alternativement, vous pouvez créer votre propre chemin avec ‘selectedPlaceWidgetBuilder’ et en extraire le résultat (voir les instructions ci-dessous).
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PlacePicker(
apiKey: APIKeys.apiKey, // Put YOUR OWN KEY here.
onPlacePicked: (result) {
print(result.address);
Navigator.of(context).pop();
},
initialPosition: HomePage.kInitialPosition,
useCurrentLocation: true,
),
),
);
ChoisirRésultat
Paramètre | Taper | La description |
---|---|---|
ID de lieu | Chaîne de caractères | Un identifiant textuel qui identifie de manière unique un lieu. Pour récupérer des informations sur le lieu, transmettez cet identifiant dans le champ placeId d’une requête API Places. Voir ID de lieu pour plus d’informations. |
géométrie | Géométrie | Contient des informations géométriques sur le résultat, comprenant généralement l’emplacement (géocode) du lieu et (éventuellement) la fenêtre d’affichage identifiant sa zone de couverture générale. |
formattedAddress | Chaîne de caractères | Une chaîne contenant l’adresse lisible par l’homme de ce lieu. Souvent cette adresse équivaut à « l’adresse postale ». |
les types | Liste |
Contient un tableau de types d’entités décrivant le résultat donné. Voir le liste des types pris en charge. Les réponses XML incluent plusieurs éléments si plusieurs types sont affectés au résultat. |
adresseComposants | Liste |
Un tableau contenant les composants distincts applicables à cette adresse. |
** Les résultats ci-dessous seront récupérés uniquement lors de l’utilisation de la recherche semi-automatique ou lorsque usePlaceDetailSearch est défini sur true lors de la recherche en faisant glisser la carte.
PickResult (facultatif)
Paramètre | Taper | La description |
---|---|---|
adrAdresse | Chaîne de caractères | Une représentation de l’adresse du lieu dans le microformat adr |
formattedPhoneNumber | Chaîne de caractères | Contient le numéro de téléphone du lieu dans son format local |
identifiant | Chaîne de caractères | ? (Non documenté chez Google – voir plus d’informations ci-dessous) |
référence | Chaîne de caractères | ? (Non documenté chez Google – voir plus d’informations ci-dessous) |
icône | Chaîne de caractères | L’URL d’une icône suggérée qui peut être affichée à l’utilisateur lorsqu’il indique ce résultat sur une carte. |
Nom | Chaîne de caractères | Nom lisible par l’homme pour le résultat renvoyé |
Horaires d’ouvertures | Détails des heures d’ouverture | Informations sur les heures d’ouverture |
Photos | Liste |
Tableau d’objets photo, chacun contenant une référence à une image |
internationalPhoneNumber | Chaîne de caractères | Le numéro de téléphone du lieu au format international |
niveau de prix | Niveau de prix | Le niveau de prix du lieu, sur une échelle de 0 à 4. Le montant exact indiqué par une valeur spécifique variera d’une région à l’autre. |
évaluation | nombre | Note du lieu, de 1,0 à 5,0, basée sur les avis d’utilisateurs agrégés. |
portée | Chaîne de caractères | |
URL | Chaîne de caractères | URL de la page Google officielle de ce lieu. |
environs | Chaîne de caractères | Répertorie une adresse simplifiée pour le lieu, y compris le nom de la rue, le numéro de la rue et la localité, mais pas la province/l’état, le code postal ou le pays |
Décalageutc | nombre | Le nombre de minutes pendant lesquelles le fuseau horaire actuel de ce lieu est décalé par rapport à l’UTC |
site Internet | Chaîne de caractères | Le site Web faisant autorité pour ce lieu |
Commentaires | Liste |
Tableau JSON contenant jusqu’à cinq avis |
Plus d’informations sur les résultats au document Google.
PlacePicker
Paramètre | Taper | La description |
---|---|---|
clé API | Chaîne de caractères | (Obligatoire) Votre clé API google map |
onPlacePicked | Rappel (PickResult) | Appelé lorsque l’utilisateur sélectionne le lieu et choisit de l’utiliser. Cela ne sera pas appelé si vous construisez manuellement ‘selectedPlaceWidgetBuilder’ car vous remplacerez le bouton par défaut ‘Sélectionner ici’. |
position initiale | LatLng | (Obligatoire) Position centrale initiale de Google Map lors de sa création. Si useCurrentLocation est défini sur true, il essaiera d’abord d’obtenir l’emplacement actuel de l’appareil à l’aide de GeoLocator. |
useCurrentLocation | bourdonner | Indique s’il faut utiliser l’emplacement actuel de l’appareil pour la position centrale initiale. Ceci sera utilisé à la place de la position initiale lorsqu’il est défini sur vrai ET l’utilisateur AUTORISER à collecter son emplacement. Si REFUSÉ, initialPosition sera utilisé. |
Précision de l’emplacement souhaité | Précision de l’emplacement | Précision de récupération de l’emplacement actuel. La valeur par défaut est ‘élevée’. |
texte d’indication | Chaîne de caractères | Texte d’astuce de la barre de recherche |
rechercheTexte | Chaîne de caractères | Un texte qui apparaît lorsque la recherche est en cours. Par défaut, ‘Recherche…’ |
proxyBaseUrl | Chaîne de caractères | Utilisé pour les appels d’API sur Google Maps. En cas d’utilisation d’un proxy, la baseUrl peut être définie. L’apiKey n’est pas nécessaire si le proxy la définit. |
httpClient | Client | Utilisé pour les appels d’API sur Google Maps. En cas d’utilisation d’une URL proxy nécessitant une authentification ou une configuration personnalisée. |
autoCompleteDebounceInMilliseconds | entier | Minuterie anti-rebond pour l’entrée complète automatique. Par défaut à 500 |
cameraMoveDebounceInMilliseconds | entier | Minuterie anti-rebond pour rechercher un lieu avec la caméra (carte) en faisant glisser. Par défaut à 750 |
initialMapTypeinitialMapType | Type de carte | MapTypes de google map. Par défaut, normal. |
enableMapTypeButton | bourdonner | Afficher ou non le bouton de changement de MapType sur la carte |
enableMyLocationButton | bourdonner | Afficher ou non le bouton de ma position sur la carte |
utiliserPinPointingSearch | bourdonner | La valeur par défaut est true. Cela permettra à l’utilisateur de faire glisser la carte et d’obtenir une information sur le lieu où pointe la broche. |
usePlaceDetailSearch | bourdonner | La valeur par défaut est false. Si vous définissez ce paramètre sur true, vous obtiendrez un résultat détaillé de la recherche en faisant glisser la carte, mais utiliserez la requête +1 sur l’API Place Detail. |
onAutoCompleteFailed | Rappel (chaîne) | Appelé lorsque la recherche complète automatique échoue |
onGeocodingSearchFailed | Rappel (chaîne) | Appelé lors de la recherche d’un lieu en faisant glisser la carte a échoué |
onMapCreated | MapCreatedCallback | Retourne le contrôleur de carte Google lorsqu’il est créé |
sélectionnéPlaceWidgetBuilder | WidgetBuilder | Spécifié dans la section ci-dessous |
pinBuilder | WidgetBuilder | Spécifié dans la section ci-dessous |
AutocompleteOffset | nombre | La position, dans le terme d’entrée, du dernier caractère utilisé par le service pour faire correspondre les prédictions |
autocompleteRadius | nombre | La distance (en mètres) à laquelle renvoyer les résultats de lieu |
autocompleteLangue | Chaîne de caractères | La code langueindiquant dans quelle langue les résultats doivent être retournés, si possible. |
Composants de saisie semi-automatique | Liste |
Regroupement de lieux auxquels vous souhaitez limiter vos résultats. Actuellement, vous pouvez utiliser des composants pour filtrer jusqu’à 5 pays. |
types de saisie semi-automatique | Liste |
Types de résultats de lieu à renvoyer. Voir Types de lieux. |
limites strictes | bourdonner | Renvoie uniquement les lieux qui se trouvent strictement dans la région définie par l’emplacement et le rayon. |
Région | Chaîne de caractères | region — Le code de région, spécifié sous la forme d’une valeur à deux caractères ccTLD (domaine de premier niveau de code de pays). La plupart des codes ccTLD sont identiques aux codes ISO 3166-1, à quelques exceptions près. Ce paramètre n’influencera que les résultats de la recherche, et non les restreindra complètement. Si des résultats plus pertinents existent en dehors de la région spécifiée, ils peuvent être inclus. Lorsque ce paramètre est utilisé, le nom du pays est omis de l’adresse_formatée résultante pour les résultats dans la région spécifiée. |
selectInitialPosition | bourdonner | Afficher ou non le lieu sélectionné lors du chargement initial de la carte. La valeur par défaut est false. |
resizeToAvoidBottomInset | bourdonner | Reportez-vous à la propriété resizeToAvoidBottomInset de Scaffold. |
chaîne de recherche initiale | Chaîne de caractères | Définit la chaîne de recherche initiale pour la recherche complète automatique |
searchForInitialValue | bourdonner | Recherche automatique de la valeur initiale au démarrage |
forceAndroidLocationManager | bourdonner | Sur les appareils Android, vous pouvez le définir sur true pour forcer le plug-in de géolocalisation à utiliser le ‘LocationManager’ pour déterminer la position au lieu du ‘FusedLocationProviderClient’. Sur iOS, cela est ignoré. |
myLocationButtonCooldown | entier | Temps de recharge en secondes pour le ‘myLocationButton’. Par défaut à 10 secondes. |
forceSearchOnZoomChanged | bourdonner | Que ce soit pour autoriser la recherche de lieu même lorsque le zoom a changé. La valeur par défaut est false. |
automatiquementImplyAppBarLeading | bourdonner | Par défaut, il y a un bouton de retour en haut. Définir false supprimera le bouton de retour. |
autocompleteOnTrailingWhitespace | bourdonner | S’il faut autoriser la saisie semi-automatique à s’exécuter même sur les espaces blancs à la fin de la recherche. La valeur par défaut est false. Numéro de référence #54. |
Plus d’informations à propos de la recherche semi-automatique sur Google document.
Personnalisation de la visualisation des lieux sélectionnés
Par défaut, lorsqu’un utilisateur choisit un lieu en utilisant la recherche complète automatique ou en faisant glisser la carte, nous affichons les informations en bas de l’écran (FloatingCard).
Cependant, si vous n’aimez pas cette UI/UX, remplacez simplement le constructeur en utilisant ‘selectedPlaceWidgetBuilder’. Le widget FlocationCard peut être réutilisé et flotter sur l’écran ou créer un tout nouveau widget comme vous le souhaitez. Il est empilé avec la carte, vous pouvez donc utiliser le Positionné widget.
Notez que l’utilisation de cette personnalisation N’INVOQUERA PAS [onPlacePicked] rappel car il remplacera le bouton « Sélectionner ici » par défaut sur la carte flottante
...
PlacePicker(apiKey: APIKeys.apiKey,
...
selectedPlaceWidgetBuilder: (_, selectedPlace, state, isSearchBarFocused) {
return isSearchBarFocused
? Container()
// Use FloatingCard or just create your own Widget.
: FloatingCard(
bottomPosition: 0.0, // MediaQuery.of(context) will cause rebuild. See MediaQuery document for the information.
leftPosition: 0.0,
rightPosition: 0.0,
width: 500,
borderRadius: BorderRadius.circular(12.0),
child: state == SearchingState.Searching ?
Center(child: CircularProgressIndicator()) :
RaisedButton(onPressed: () { print("do something with [selectedPlace] data"); },),
);
},
...
),
...
Paramètres | Taper | La description |
---|---|---|
le contexte | ConstruireContext | Valeur de contexte de construction de Flutter |
lieu sélectionné | ChoisirRésultat | Données de résultat du lieu sélectionné par l’utilisateur |
Etat | État de recherche | État de l’action de recherche. (Inactif, Recherche) |
isSearchBarFocused | bourdonner | Indique si la barre de recherche est actuellement ciblée pour que le clavier s’affiche |
Personnalisation de l’épingle
Par défaut, l’icône Pin est fournie avec une animation de sélection très simple lors des déplacements. Cependant, vous pouvez également créer votre propre widget pin en utilisant ‘pinBuilder’
PlacePicker(apiKey: APIKeys.apiKey,
...
pinBuilder: (context, state) {
if (state == PinState.Idle) {
return Icon(Icons.favorite_border);
} else {
return AnimatedIcon(.....);
}
},
...
),
...
Paramètres | Taper | La description |
---|---|---|
le contexte | ConstruireContext | Valeur de contexte de construction de Flutter |
Etat | État de la broche | État de la broche. (Préparation ; Lors du chargement de la carte, Inactif, Déplacement) |
Changer les couleurs de la FloatingCard par défaut
Bien que vous puissiez créer votre propre mosaïque de prédiction, vous pouvez toujours modifier le style de la mosaïque par défaut à l’aide de themeData comme ci-dessous :
// Light Theme
final ThemeData lightTheme = ThemeData.light().copyWith(
// Background color of the FloatingCard
cardColor: Colors.white,
buttonTheme: ButtonThemeData(
// Select here's button color
buttonColor: Colors.black,
textTheme: ButtonTextTheme.primary,
),
);
// Dark Theme
final ThemeData darkTheme = ThemeData.dark().copyWith(
// Background color of the FloatingCard
cardColor: Colors.grey,
buttonTheme: ButtonThemeData(
// Select here's button color
buttonColor: Colors.yellow,
textTheme: ButtonTextTheme.primary,
),
);
Demandes de fonctionnalités et problèmes
Veuillez soumettre les demandes de fonctionnalités et les bogues à l’adresse Traqueur d’incidents.
Autres forfaits utiles qui pourraient vous intéresser
Authentification Firebase simplifiée
Conception matérielle Cadran abrégé
Bifurqué à partir du package d’origine qui n’est plus actif
Sélecteur de lieux Google Maps
GitHub
Voir Github