Ошибка при получении местоположения из будущего [VERBOSE-2: ui_dart_state.cc (148)] Необработанное исключение: неверный аргумент (ы) - PullRequest
0 голосов
/ 15 апреля 2019

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

В настоящее время я использую пакет Geolocator для получения Future, но при получении значения я сталкиваюсь с ошибкой.

Чтобы получить местоположение, вот что я делаю:

Future<Position> locateUser() async {
  return Geolocator()
      .getCurrentPosition(desiredAccuracy: LocationAccuracy.high)
      .then((location) {
    if (location != null) {
      print("Location: ${location.latitude},${location.longitude}");
    }
    return location;
  });
}

И чтобы получить эти координаты в функции виджета сборки, Я делаю это:

bool firstTime = true;
String latitude;
String longitude;

  @override
  Widget build(BuildContext context) {
    if(firstTime == true) {
      locateUser().then((result) {
        setState(() {
          latitude = result.latitude.toString();
          longitude = result.longitude.toString();
        });
      });
      fetchPost(latitude, longitude);
      firstTime = false;
    }

Я получаю следующую ошибку:

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: Invalid argument(s)

Я хочу иметь возможность хранить эти координаты в переменных и передавать их в другие функции, которые у меня есть. Я довольно новичок во Флаттере, поэтому любая помощь будет признательна!

1 Ответ

0 голосов
/ 15 апреля 2019

Вы используете метод async, поэтому вы можете использовать ключевое слово await, чтобы получить ответ:

Измените это

            Future<Position> locateUser() async {
              return Geolocator()
                  .getCurrentPosition(desiredAccuracy: LocationAccuracy.high)
                  .then((location) {
                if (location != null) {
                  print("Location: ${location.latitude},${location.longitude}");
                }
                return location;
              });
            }

На это:

            Future<Position> locateUser() async {
              final location = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);

              if (location != null) {
                  print("Location: ${location.latitude},${location.longitude}");
               }

              return location;
            }

Вызовите fetchPost(latitude, longitude) внутри вашего обратного вызова и удалите ваш вызов из метода сборки и перейдите на метод initState, или вы можете использовать FutureBuilder.

      @override
      void initState() {
        locateUser().then((result) {
            setState(() {
              latitude = result.latitude.toString();
              longitude = result.longitude.toString();
              fetchPost(latitude, longitude);
            });

          });
        super.initState();
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...