Не найдя в Интернете никакой документации о том, как интегрировать автозаполнение Google с React Native (без использования create-react-app , expoили любого пакета npm для этого) я решил написать эту небольшую пошаговую статью.

Первое, что вам нужно сделать, это открыть платный аккаунт Google. Я не буду подробно описывать, как это сделать, так как вы можете найти его в документации по API Google.



Я упомяну, что для этого вам необходимо включить API Places API и Maps JavaScript API. Вы можете найти их на https://console.cloud.google в разделе API и сервисы.

Последнее, что я скажу по этому поводу — это то, что когда вы генерируете свой ключ API, убедитесь, что он ограничен — на случай, если кто-то, кто не должен его видеть, увидит его.

Сгенерируйте ключ здесь:

После создания ключа. щелкните значок «Редактировать карандаш», чтобы ограничить ключ.

Теперь, когда у вас есть платная учетная запись Google, ограниченный ключ и вы активировали API, с которыми хотите работать, мы можем увидеть, как реализовать это в коде.

Первое, что вам нужно, это иметь возможность получить местоположение со смартфона, на котором работает ваше приложение. для этого вы будете использовать этот пакет npm:



Теперь мы можем начать использовать Google Places API.

В этом примере вы будете использовать хуки React Native. Первое, что вы закодируете в компоненте, который будет контролировать и управлять автозаполнением, — это создать хук useState для данных о местоположении и useEffect для вызова нашего установленного пакета geolocation при монтировании компонента.

const [geoLocation, setGeoLocation] = useState(‘’);
….
useEffect(() => {
Geolocation.getCurrentPosition((position, err) => {
if (err) {
     setGeoLocation({latitude: null, longitude: null});
} else {
     const location = {
          latitude: position.coords.latitude,
          longitude: position.coords.longitude,
     };
     setGeoLocation(location);
  }
});
}, []);

Автозаполнение — это не более чем простой компонент input. (<Form> и <Item> — это компоненты из библиотеки пользовательского интерфейса native-base для React Native. Здесь по-прежнему нет никакой магии:

const [autoAddress, setAutoAddress] = useState([]);
const [chosenAddress, setChosenAddress] = useState(‘’);
<Form>
   <Item stackedLabel style={addressFieldsStyles.item}>
    <Label>Adress</Label>
     <Input
       placeholder=”dizengoff 236, Tel-Aviv”
       onChangeText={onGoogleAutocomplete}
       value={chosenAddress}
       style={addressFieldsStyles.item}
     />
   {autoAddress.length > 0 && getAutoCompleteList()}
 </Item>
…
</Form>

Функция onChange, которую вы вызываете во входных данных, установит новый state (поэтому компонент input будет обновляться в режиме реального времени) и вызовет функцию debounce, чтобы сделать запрос на выборку (вы используете debounce, чтобы не делать запрос fetch). для каждой буквы, которую набирает пользователь).

const onGoogleAutocomplete = data => {
                 setChosenAddress(data);
                 debouncedPlacesFetch(data);
         };

Обратите внимание, что вы также используете метод lodash debounce и хук React Native useCallback. Причина в том, что метод debounce будет вызываться только один раз (обратите внимание, что это делается внутри компонента, но вне значения returned)

Какие параметры содержит URL-адрес извлечения:

  • ключ : ключ, который вы получили при создании учетных данных.
  • input : буквы, введенные пользователем в поле ввода.
  • местоположение: местонахождение пользователя при отправке запроса на выборку. (это поможет вам получить суженный ответ от Google)
  • радиус: это не обязательно, но насколько я понимаю, это улучшит результаты, и всегда должно быть установлено на 2000 (метров)
const debouncedPlacesFetch = useCallback(
_.debounce(
locationTypedByUser => {
console.log(‘fetching data from google’);
const url = `https://maps.googleapis.com/maps/api/place/autocomplete/json?key=AI********Cc&input=${locationTypedByUser}&location=${geoLocation.latitude},${geoLocation.longitude}&radius=2000`;
fetch(url)
    .then(data => {
        return data.json();
     })
    .then(data => {
        const autoComRes = _.map(data.predictions, item => item.description);
       setAutoAddress(autoComRes);
    })
     .catch(e => console.log(e));
  },300,{trailing: true, leading: false},
),[]);

Вы будете использовать состояние setAutoAddress для хранения данных для выпадающего меню, которое вы создадите через мгновение.

Обратите внимание, что в этом примере вы используете ключ API в коде. НИКОГДА не размещайте его в своем коде или в переменной env, так как эти данные могут быть найдены не теми людьми в вашем исходном коде (вы не можете скрыть это таким образом). Вместо этого используйте сервер или лямбда-функцию AWS для выполнения выборки в Google Places API.

Создание меню dropDown:

const getAutoCompleteList = () => {
    return (
       <ScrollView style={addressFieldsStyles.autoComcontainer}>
          {_.map(autoAddress, (item, index) => {
               return (
                    <TouchableHighlight 
                    key={index}
                    onPress={e => { 
                         setChosenAddress(item);
                         setAutoAddress([]);
                         }}>
                     <View 
                      style={addressFieldsStyles.autoComItem} 
                      key={index}>
                       <Text 
                         style={addressFieldsStyles.autoComText}>
                            {item}
                       </Text>
                      </View>
                    </TouchableHighlight>
                    );
             })}
        </ScrollView>
);};

Используйте scrollView вместо flateList, чтобы избежать предупреждения React Native, если ваше автозаполнение является дочерним элементом компонента с тегом flateList like в нем.

Это. Теперь вы можете начать использовать API автозаполнения мест Google.