Flutter-geolocator: Получить местоположение пользователя через браузер

Созданный на 13 февр. 2020  ·  32Комментарии  ·  Источник: Baseflow/flutter-geolocator

Привет, мне интересно, позволяют ли эти плагины получать местоположение пользователя через браузер? Я не нашел никакой информации об этом? Есть ли другие плагины, которые это позволяют? Заранее спасибо за помощь !

web enhancement

Самый полезный комментарий

@mvanbeusekom Если я найду время, чтобы научиться это делать, я мог бы попробовать. Прямо сейчас я нашел способ сделать это через пакет js. Я быстро публикую код здесь, если кто-то хочет его прямо сейчас:

@JS('navigator.geolocation') // navigator.geolocation namespace
library jslocation; // library name can be whatever you want

import "package:js/js.dart";

@JS('getCurrentPosition') // Accessing method getCurrentPosition from Geolocation API
external void getCurrentPosition(Function success(GeolocationPosition pos));

@JS()
<strong i="7">@anonymous</strong>
class GeolocationCoordinates {
  external double get latitude;
  external double get longitude;
  external double get altitude;
  external double get accuracy;
  external double get altitudeAccuracy;
  external double get heading;
  external double get speed;

  external factory GeolocationCoordinates(
      {double latitude,
      double longitude,
      double altitude,
      double accuracy,
      double altitudeAccuracy,
      double heading,
      double speed});
}

@JS()
<strong i="8">@anonymous</strong>
class GeolocationPosition {
  external GeolocationCoordinates get coords;

  external factory GeolocationPosition({GeolocationCoordinates coords});
}

And to call this :  

  success(pos) {
    try {
    print(pos.coords.latitude);
    print(pos.coords.longitude);
    } catch (ex) {
      print("Exception thrown : " + ex.toString());
    }
  }
  _getCurrentLocation() {
    if (kIsWeb) {
      getCurrentPosition(allowInterop((pos) => success(pos)));
    }

Вам просто нужно вызвать метод _getCurrentLocation.

Все 32 Комментарий

Привет @lionelquirynen , на данный момент у нас нет реализации для веб-платформы. Мы хотели бы поддержать это и открыты для запросов на вытягивание.

Для дальнейшего использования вот две статьи от команды Flutter, описывающие, как добавить веб-поддержку в плагины:

@mvanbeusekom Если я найду время, чтобы научиться это делать, я мог бы попробовать. Прямо сейчас я нашел способ сделать это через пакет js. Я быстро публикую код здесь, если кто-то хочет его прямо сейчас:

@JS('navigator.geolocation') // navigator.geolocation namespace
library jslocation; // library name can be whatever you want

import "package:js/js.dart";

@JS('getCurrentPosition') // Accessing method getCurrentPosition from Geolocation API
external void getCurrentPosition(Function success(GeolocationPosition pos));

@JS()
<strong i="7">@anonymous</strong>
class GeolocationCoordinates {
  external double get latitude;
  external double get longitude;
  external double get altitude;
  external double get accuracy;
  external double get altitudeAccuracy;
  external double get heading;
  external double get speed;

  external factory GeolocationCoordinates(
      {double latitude,
      double longitude,
      double altitude,
      double accuracy,
      double altitudeAccuracy,
      double heading,
      double speed});
}

@JS()
<strong i="8">@anonymous</strong>
class GeolocationPosition {
  external GeolocationCoordinates get coords;

  external factory GeolocationPosition({GeolocationCoordinates coords});
}

And to call this :  

  success(pos) {
    try {
    print(pos.coords.latitude);
    print(pos.coords.longitude);
    } catch (ex) {
      print("Exception thrown : " + ex.toString());
    }
  }
  _getCurrentLocation() {
    if (kIsWeb) {
      getCurrentPosition(allowInterop((pos) => success(pos)));
    }

Вам просто нужно вызвать метод _getCurrentLocation.

@lionelquirynen Можете ли вы опубликовать свой pubspec.yaml? Я пытаюсь добавить строку: import ' package:Shared/locationJs.dart '; как вы разместили его на stackexchange , но я получаю ошибки. Вы создали общую папку на корневом уровне?

Привет @lionelquirynen!

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

Однако у меня осталось еще два вопроса. Возможно, вы также сталкивались с этими проблемами и у вас уже есть решение.
Мои вопросы:

1.) Вы уже нашли способ запрашивать у посетителей веб-сайта разрешение запрашивать их местоположение?
Для приложений вы делаете это для Android в AndroidManifest.xml и для iOs в info.plist. Но как мне это сделать для веб-приложения?

2.) Вы уже построили функцию, которая вычисляет расстояние между двумя точками в метрах?

Я определенно буду рад, если вы ответите! Вы бы мне очень помогли!

@xpat да, у меня есть папка, в которой находится файл locationJs, извините, я только сегодня увидел ваше сообщение.
Для pubspec ничего не меняется, нужно просто добавить в него пакет js.

@ Ларс Хеннинг98
Привет,

1) С кодом, который я разместил, он хорошо работает, чтобы запросить разрешение для Интернета! Если вы используете этот код для Интернета, он автоматически запросит разрешение. Вы можете попробовать его в моем фиктивном проекте, если хотите: https://www.nearysport.com/
2) Да, но вы должны сделать это на стороне сервера, на стороне клиента вы получаете широту и долготу от пользователя, а затем вычисляете расстояние между двумя точками геолокации, например, с помощью формулы Хаверсина.

Дайте мне знать, если я ответил на ваш вопрос!

@lionelquirynen Спасибо, я бегаю по кругу, пытаясь понять, как заставить это работать для классного проекта. У меня работает pubspec.yaml, и я импортировал файл locationJS.dart в свой файл loading_screen.dart. В любом случае, возможно, вы сможете легко увидеть, как это работает. Тем временем я буду продолжать отключаться. Вот ссылка на сообщение, которое я разместил на доске объявлений класса: https://www.appbrewery.co/courses/548873/lectures/9989052/comments/5326630

К вашему сведению @LarsHenning98

Не могли бы вы опубликовать свой pubspec и экран загрузки?

@lionelquirynen Да, pubspec: `имя: clima
описание: Новое приложение Flutter.

version: 1.0.0+1

environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  cupertino_icons: ^0.1.2
  geolocator: ^5.3.0
  js: ^0.6.1+1

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true

  assets:
  - images/

  fonts:
  - family: Spartan MB
    fonts:
    - asset: fonts/SpartanMB-Black.otf
      weight: 900`

@lionelquirynen и loading_screen.dart:

import 'dart:developer';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:clima/locationJS.dart';
import 'package:js/js.dart';

class LoadingScreen extends StatefulWidget {
  <strong i="7">@override</strong>
  _LoadingScreenState createState() => _LoadingScreenState();
}

class _LoadingScreenState extends State<LoadingScreen> {
  void getCurrentPosition() async {
    Position position = await Geolocator()
        .getCurrentPosition(desiredAccuracy: LocationAccuracy.low);

    print(position);
  }

  <strong i="8">@override</strong>
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RaisedButton(
          onPressed: () {
// Get the current location
          },
          child: Text('Get Location'),
        ),
      ),
    );
  }
}

Вы не вызываете метод, поэтому вы должны поместить его в InitState

@lionelquirynen Спасибо за помощь. Я ненавижу полагаться на вас (или на кого-либо еще), но я все еще не понимаю, в какой файл его поместить или из какого вызывать. Вот ссылка на полный проект. . И это из 13-го модуля в Complete Flutter Development Bootcamp , который, к сожалению, был сделан до flutter web.

Вы можете вызвать метод getcurrentposition в onpressed, потому что я нигде не вижу вызова метода, вы должны вызвать его где-нибудь, чтобы вызвать запрос местоположения

Вот где я застрял. Я только что обновил файл loading_screen.dart на случай, если вы захотите взглянуть на то, что я пытаюсь сделать, основываясь на том, как я понимаю ваше предложение. В Dart Analysis я получаю информационное сообщение: «Объявление 'getCurrentPosition' не упоминается, и что пакеты js.dart и clima/locationJS.dart не используются, а затем print(value.coords.latitude ) и print(value.coords.longitude) подчеркнуты серыми волнистыми линиями, а сообщение гласит: «Набор литералов не поддерживался до версии 2.2, но этот код необходим для работы в более ранних версиях».

Ваше местоположение обновлено?

Я использую код, который вы опубликовали на stackoverflow , если вы это имеете в виду? Я снова запущу флаттер-паб, но да, я считаю, что он обновлен.

Вы вставили код из github, а не из stackoverflow?

Левен. 28 фев. 2020 в 21:53, Кристоф Р. Патральдо <
уведомления@github.com> текст:

Я снова запущу флаттер-паб, но да, я считаю, что он обновлен.


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/Baseflow/flutter-geolocator/issues/392?email_source=notifications&email_token=ANUIRZMOEPTHHNBI7NDU3G3RFF2TJA5CNFSM4KURNFD2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOENKDZHY,37issment-1
или отписаться
https://github.com/notifications/unsubscribe-auth/ANUIRZLLEKQ2CKHF2A7VUIDRFF2TJANCNFSM4KURNFDQ
.

Я имею в виду .dart

Вы должны использовать код, который я разместил на github выше. Я должен обновить свой ответ на stackoverflow.

Я сосредоточился на коде stackoverflow, потому что его было легче понять. Но теперь я обновил файлы loading_screen.dart и locationJS.dart вашим кодом из Github. Я получаю сообщения об ошибках Неопределенное имя «pos», и метод «success» не определен для класса «_LoadingScreenState», а метод «_getCurrentLocation» не определен для класса «_LoadingScreenState».

@JS('navigator.geolocation')
library jslocation;

import 'package:js/js.dart';

@JS('getCurrentPosition')
external void getPosition(Function success(GeolocationPosition pos));

@JS()
<strong i="6">@anonymous</strong>
class GeolocationCoordinates {
  external double get latitude;
  external double get longitude;
  external double get altitude;
  external double get accuracy;
  external double get altitudeAccuracy;
  external double get heading;
  external double get speed;
  external factory GeolocationCoordinates(
  {double latitude,
  double longitude,
  double altitude,
  double accuracy,
  double altitudeAccuracy,
  double heading,
  double speed});
}

@JS()
<strong i="7">@anonymous</strong>
class GeolocationPosition {
  external GeolocationCoordinates get coords;

  external factory GeolocationPosition({GeolcationCoordinates});
}
import 'dart:developer';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:clima/locationJS.dart';
import 'package:js/js.dart';

class LoadingScreen extends StatefulWidget {
  <strong i="5">@override</strong>
  _LoadingScreenState createState() => _LoadingScreenState();
}

class _LoadingScreenState extends State<LoadingScreen> {
  void getCurrentPosition() async {
      success(pos);
      try
          {
            print(pos.coords.latitude);
            print(pos.coords.longitude);
          } catch (ex) {
        print("Exception thrown: " + ex.toString());
      }
    }

  <strong i="6">@override</strong>
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RaisedButton(
          onPressed: () {
// Get the current location
         _getCurrentLocation();

          },
          child: Text('Get Location'),
        ),
      ),
    );
  }
}

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

Ошибки, которые я получаю, возникают после того, как я использовал код, который вы разместили на Github (выше). Я не знал, как именно добавить этот код в мой проект (который я создаю с помощью флаттера). Например, куда мне поместить часть, которая начинается с успеха? Пробовал ставить сюда:

класс _LoadingScreenState расширяет состояние {
недействительным getCurrentPosition () асинхронный {
успех(поз);
пытаться
{

У вас есть общедоступный репозиторий с полным кодом вашего проекта?

Нет, это не общедоступно, но выше я разместил код:

успех (позиция) {
пытаться {
печать (pos.coords.широта);
печать (pos.coords.longitude);
} поймать (пример) {
print("Выброшено исключение: " + ex.toString());
}
}
_getCurrentLocation () {
если (kIsWeb) {
getCurrentPosition(allowInterop((pos) => успех(pos)));
}еще{
//Получить местоположение iOS Android
}
}

Итак, вы копируете и вставляете этот код, и все, что вам нужно сделать, это вызвать _getCurrentLocation() в вашем методе onPressed.

Этот код находится в файле locationJS.dart или в файле loading_screen.dart?

`И чтобы вызвать это:

успех (позиция) {
пытаться {
печать (pos.coords.широта);
печать (pos.coords.longitude);
} поймать (пример) {
print("Выброшено исключение: " + ex.toString());
}
}
_getCurrentLocation () {
если (kIsWeb) {
getCurrentPosition(allowInterop((pos) => успех(pos)));
}`

На экране загрузки ! Вы поняли, как это работает?

Я могу быть там. У меня только что был Dart Analysis (Android Studio), создайте функцию Function (GeoLocationPosition pos), получите успех => null; Я посмотрю, что я могу сделать из этого. Но нет, я действительно не понимаю, что происходит. Эта проблема — получение геолокации для Интернета — стала для меня настоящей проблемой. Иногда мне кажется, что я изучил только самый минимум в своем Flutter Bootcamp.

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

Я делаю успехи. Наконец-то я получил код для всплывающего окна разрешения. И он печатает сообщение на консоль. Спасибо за вашу помощь и поддержку. Я думаю, что это, наконец, начинает работать, и как только это произойдет, я попытаюсь разобраться в этом. Надеемся, что этот плагин геолокации будет обновлен для флаттера. Между тем, еще раз спасибо за ваше время, @lionelquirynen

Ок, прекрасно ! Надеюсь, вы не слишком запутались, дайте мне знать, если вам нужно руководство!

Вот рабочая реализация для Интернета:
https://github.com/AseemWangoo/experiments_with_web
https://fir-signin-4477d.firebaseapp.com/#/location (пока работает)
Может быть интегрирован как плагин или как есть. Если как есть, используйте kIsWeb .

Я хочу получить местоположение пользователя в сети флаттера, но Mozilla GeoLocation не работает !!! Может ли кто-нибудь мне помочь?
Это мой вопрос о StackOverFlow: https://stackoverflow.com/questions/64411270/flutter-web-get-location-on-web-by-location-plugin

Есть какие-нибудь новости или что-нибудь о веб-поддержке этого пакета?!

@mvanbeusekom

Была ли эта страница полезной?
0 / 5 - 0 рейтинги