как получить местоположение пользователя в flutter

#flutter #api #geolocation #location #flutter-getx

Вопрос:

Я хочу найти пользователя и отправить координаты его местоположения через api на сервер, пожалуйста, ответьте кодом, я пробовал library geolocator: ^ 7.7.0

 void getCurrentLocation() async {
     Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
     var lat = position.latitude;
     var long = position.longitude;
 print("Latitude: $lat and Longitude: $long");
   }
 

Этот код не работает, ошибка:

 [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: MissingPluginException(No implementation found for method getCurrentPosition on channel flutter.baseflow.com/geolocator)
E/flutter (25476): #0      MethodChannel._invokeMethod
package:flutter/…/services/platform_channel.dart:156
E/flutter (25476): <asynchronous suspension>
E/flutter (25476): #1      MethodChannelGeolocator.getCurrentPosition (package:geolocator_platform_interface/src/implementations/method_channel_geolocator.dart:128:27)
E/flutter (25476): <asynchronous suspension>
E/flutter (25476): #2      getCurrentLocation
package:check_time/Screens/fingerprint_Screen.dart:84
E/flutter (25476): <asynchronous suspension>
 

Комментарии:

1. запустите flutter doctor и добавьте сюда экраны

Ответ №1:

Попробуйте перезапустить приложение! с этого момента должно работать. Горячий перезапуск не будет работать при добавлении плагинов.

Комментарии:

1. больше не работает * Что пошло не так: не удалось выполнить задачу ‘:geolocator_android:compileDebugJavaWithJavac’. > Сбой компиляции; подробности см. В выводе ошибки компилятора. * Попробуйте: запустите с параметром —stacktrace, чтобы получить трассировку стека. Запустите с параметром —info или —debug, чтобы получить больше выходных данных журнала. Запустите с помощью —scan, чтобы получить полную информацию. * Получите дополнительную помощь на help.gradle.org ОШИБКА СБОРКИ в исключении 49s: ошибка сборки assembleDebug задачи Gradle с кодом выхода 1

2. вы следовали инструкциям для Android? попробуйте flutter clean тоже!

3. обновление компилирует dkversion 31 здесь android app build.gradle

Ответ №2:

Создайте приложение заново. Попробуйте этот код.

     Future<void> getCurrentLocation() async {
      Position position = await Geolocator.getCurrentPosition(
                           desiredAccuracy:LocationAccuracy.high);
      double lat = position.latitude;
      double long = position.longitude;
      print("Latitude: $lat and Longitude: $long");
  }
 

Комментарии:

1. не работает * Что пошло не так: не удалось выполнить задачу ‘:geolocator_android:compileDebugJavaWithJavac’. > Сбой компиляции; подробности см. В выводе ошибки компилятора. * Попробуйте: запустите с параметром —stacktrace, чтобы получить трассировку стека. Запустите с параметром —info или —debug, чтобы получить больше выходных данных журнала. Запустите с помощью —scan, чтобы получить полную информацию. * Получите дополнительную помощь на help.gradle.org ОШИБКА СБОРКИ за 30 секунд Исключение: ошибка сборки assembleDebug задачи Gradle с кодом выхода 1

2. измените версию geolocator на 7.6.2

3. не сработало * Что пошло не так: не удалось выполнить задачу ‘:geolocator_android:compileDebugJavaWithJavac’. > Сбой компиляции; подробности см. В выводе ошибки компилятора. * Попробуйте: запустите с параметром —stacktrace, чтобы получить трассировку стека. Запустите с параметром —info или —debug, чтобы получить больше выходных данных журнала. Запустите с помощью —scan, чтобы получить полную информацию. * Получите дополнительную помощь на help.gradle.org ОШИБКА СБОРКИ за 10 секунд Исключение: ошибка сборки assembleDebug задачи Gradle с кодом выхода 1

Ответ №3:

Эта ошибка обычно возникает, если вы не внесли изменения в приложение в соответствии с требуемой платформой приложения.

т.е. android, iOS, Web

ПЕРЕЙДИТЕ к пакету в описании пакета в разделе Usage

следуйте инструкциям по реализации для платформы, которую вы создаете

введите описание изображения здесь

Ответ №4:

Есть несколько полезных шагов, которым вы должны следовать, которые упомянуты в readme пакета. Обновить

androidappbuild.gradle

 android {
  compileSdkVersion 31

  ...
}
 

Ответ №5:

Попробуйте приведенный ниже код, надеюсь, он вам поможет, обратитесь к геолокатору здесь и геокодированию здесь, чтобы получить широту и долготу и название вашего местоположения

Создайте позицию и одну переменную для вашей текущей позиции и метода init()

 Position? _currentPosition;
  String? _currentAddress;
  void initState() {
    super.initState();
    getCurrentLocation();
  }
 

Функция для получения широты и долготы

  getCurrentLocation() {
    Geolocator.getCurrentPosition(
            desiredAccuracy: LocationAccuracy.best,
            forceAndroidLocationManager: true)
        .then((Position position) {
      setState(() {
        _currentPosition = position;
         print(position.latitude);
         print(position.longitude);
        _getAddressFromLatLng();
      });
    }).catchError((e) {
      print(e);
    });
  }
 

Функция определения местоположения по вашей широте и долготе

 _getAddressFromLatLng() async {
    try {
      List<Placemark> placemarks = await placemarkFromCoordinates(
          _currentPosition!.latitude, _currentPosition!.longitude);

      Placemark place = placemarks[0];

      setState(() {
        _currentAddress = "${place.subLocality}";//here you can used place.country and other things also
        print(_currentAddress);
      });
    } catch (e) {
      print(e);
    }
  }
 

Ваш виджет:

 Column(
      children: [
        if (_currentPosition != null amp;amp; _currentAddress != null)
          Text(
            _currentAddress!,
            style: TextStyle(
              fontWeight: FontWeight.bold,
              letterSpacing: .5,
              fontSize: 15,
              color: Colors.black,
            ),
          ),
      ],
    )
 

Добавьте нижеприведенные строки внутри androidappsrcmainAndroidManifest.xml файла над application тегом

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
 

Перейдите в androidappbuild.gradle файл и измените изменения ниже

 compileSdkVersion 31
minSdkVersion 21
targetSdkVersion 29
 

Комментарии:

1. * Что пошло не так: не удалось выполнить задачу ‘:geolocator_android:compileDebugJavaWithJavac’. > Сбой компиляции; подробности см. В выводе ошибки компилятора. * Попробуйте: запустите с параметром —stacktrace, чтобы получить трассировку стека. Запустите с параметром —info или —debug, чтобы получить больше выходных данных журнала. Запустите с помощью —scan, чтобы получить полную информацию. * Получите дополнительную помощь на help.gradle.org ОШИБКА СБОРКИ за 32 секунды Исключение: ошибка сборки assembleDebug задачи Gradle с кодом выхода 1

2. @HamZa посмотрите мой обновленный ответ и измените некоторый код в androidappbuild.gradle файле и re-run вашем приложении и дайте мне знать