Wenn ich versuche,CurrentLocation zu bekommen, wird es nie aufgelöst. Ich bin kein iOS-Experte, also bitte, wenn ich etwas vergessen habe, erklÀre es mir einfach.
Future<Position> getCurrentPosition({
LocationAccuracy accuracy = LocationAccuracy.best,
GeolocationPermission geolocationPermission =
GeolocationPermission.location,
}) =>
_geolocator.getCurrentPosition(
desiredAccuracy: accuracy,
locationPermissionLevel: geolocationPermission,
);
Podfile:
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
'PERMISSION_LOCATION=1',
]
Info.plist:
<key>NSLocationWhenInUseUsageDescription</key>
<string>Need location when in use</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Always and when in use!</string>
<key>NSLocationUsageDescription</key>
<string>Older devices need location.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Can I haz location always?</string>
BEARBEITEN:
Ich habe es auf einem echten Android-GerÀt getestet und das Problem tritt auch auf.
Meine Manifest-Standortberechtigungen:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
Geben Sie eine Position zurĂŒck.
Rufen Sie einfach geolocator.GetCurrentPosition auf.
Version: 5.1.5.
Plattform:
Ich bekomme den gleichen Fehler. Dies geschieht sowohl auf iOS als auch auf Android. . . .
Ich erhalte den gleichen Fehler auf dem Simulator mit iOS 10.3 oder iOS 13.4 und auch auf meinem iPad mit iOS 13.4 .
mycode.dart:
Position pos = await Geolocator()
.getCurrentPosition(
locationPermissionLevel:
GeolocationPermission.locationWhenInUse,
desiredAccuracy: LocationAccuracy.high)
Info.plist:
<key>NSLocationAlwaysUsageDescription</key>
<string>Can I haz location always?</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Need location when in use</string>
Version: 5.3.1
Gleiches Problem bei mir unter Android 8.0. Ich erwÀge, einen 10-Sekunden-Timer direkt in den Quellcode zu schreiben, der bei Erreichen ausgelöst wird.
@brenoasm tritt dieses Problem auf dem Simulator oder auf einem echten GerÀt auf?
@dammel Am Simulator ist es wichtig, den Simulator so zu konfigurieren, dass er einen Standort ausgibt. Dies kann ĂŒber die folgenden MenĂŒpunkte der Simulatoranwendung erfolgen: Funktionen -> Ort -> (wĂ€hlen Sie eine andere Option als "keine").
@mvanbeusekom Was ist, wenn ein echtes GerÀt keinen Standort ausgibt? Es sollte nicht sein, wenn der Benutzer GPS ausgeschaltet hÀtte, oder?
@mvanbeusekom Ich habe auf dem Simulator fĂŒr IOS getestet (ich habe kein IPhone, um es auf einem echten GerĂ€t zu testen). Ich habe es auf einem echten Android-GerĂ€t getestet und habe das gleiche Problem ... Ich werde die Informationen zu meinem Android-GerĂ€t bearbeiten und hinzufĂŒgen.
Ich habe das gleiche Problem mit einem echten Android-GerÀt ...
@mvanbeusekom Danke fĂŒr deine Hilfe. Dein Tipp fĂŒr die Simulatoren hat bei mir funktioniert.
Ich habe nichts geÀndert, aber es funktioniert jetzt wieder auf dem iPad (echtes GerÀt).
Getestet auf einem iOS-Simulator und einem iOS-GerÀt, hatte ich kein Problem, aber ich habe das gleiche Problem auf einem Android-Emulator
Ich werde versuchen, meinen Fall im Detail zu erklÀren.
Erstens tritt das Problem sowohl auf Android- als auch auf iPhone-GerÀten auf (ich verwende Testflight, um die App mit meinem QA-Team zu testen), aber auch im Android-Emulator und iOS-Simulator.
Die Methode 'getCurrentPosition' gibt manchmal keine Position zurĂŒck, aber nach einer Reihe von Versuchen tut sie es. Ich habe dieses Problem normalerweise, wenn ich die App zum ersten Mal installiere. Nach einer gewissen Zeit beginnt die Methode plötzlich, Ihnen die aktuelle Position zu bringen.
Das Problem bei diesem Problem ist, dass es nicht immer passiert. Sie können die App installieren, und manchmal gibt die Methode beim ersten Versuch die aktuelle Position zurĂŒck ...
ZusÀtzliche Anmerkungen:
Mein Umfeld:
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[â] Flutter (Channel stable, v1.12.13+hotfix.9, on Linux, locale en_GB.UTF-8)
[â] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[â] Android Studio (version 3.6)
[â] IntelliJ IDEA Community Edition (version 2019.3)
[â] Connected device (2 available)
âą No issues found!
Ăbergangslösung in meinem Projekt:
Ich denke, # 375 und # 386 beziehen sich auf dieses Problem
Hier das gleiche Problem, LG G6, Android 9.0.
Löst sich nie.
Es gibt einen seltsamen Weg, wie ich es zum Laufen bringen kann:
Ich starte die Google Maps App, um die Position dort zu erhalten. Dazu muss ich den Positionssensor und das WLAN aktivieren (wahrscheinlich wĂŒrde auch die mobile Datenverbindung funktionieren, nicht getestet).
So bekomme ich die Position in Google Maps.
Danach funktioniert es auch in meiner App (egal ob meine App danach gestartet wurde oder bereits lÀuft).
Wenn ich WLAN beende oder die Position ausschalte dann funktioniert es nicht mehr, auch wenn ich sie wieder einschalte.
Das SchlieĂen von Google Maps zu einem beliebigen Zeitpunkt, auch bevor meine App geöffnet ist, spielt keine Rolle (aber manchmal muss ich Google Maps mehr als einmal öffnen.)
Es scheint mir, als ob Google Maps etwas festlegt, das auch nach dem SchlieĂen von Maps bestehen bleibt und vom Geolocator benötigt wird.
Bearbeitung/Korrektur:
Es ist noch komplizierter, das Verfahren mit Google Maps funktionierte mit allen Argumenten fĂŒr "desiredAccuracy", aber beim Ausschalten des WLANs gab es 2 Kategorien:
Nach dem Neustart wird der GerÀtestandort nicht mehr aufgelöst. Ich muss also den Standort mit Google Maps abrufen und dann funktioniert es wieder wie beschrieben.
(Irgendwas wahrscheinlich unwichtig, unabhÀngig, nach einer Neuinstallation der App sieht der Berechtigungsdialog anders aus, hat kein "Don't ask again"-Checkbox, sondern nur das erste Mal, wenn der Dialog angezeigt wird, danach immer die gleicher Dialog mit der Checkbox)
Gleiches Problem, Android 10, OnePlus 7 Pro.
Der oben beschriebene Trick mit Google Maps hat bei mir nicht funktioniert, aber irgendwie hat sich nach einiger Zeit der Standort aufgelöst, ohne dass ich etwas Besonderes getan habe. Ich habe gerade eine zuvor geöffnete Seite im Browser gelesen, bin dann zurĂŒck zu meiner App gewechselt und habe einen Dialog gesehen, der mir den Ort mitteilte - der Dialog ist so eingerichtet, dass er anzeigt, wann die Zukunft aufgelöst wird, also hat er sich schlieĂlich aufgelöst, aber es hat eine Weile gedauert . Danach löste sich der Ort bei jedem Versuch gut auf.
Wie oben erwÀhnt, wird der Standort nach dem Neustart nicht mehr aufgelöst.
Am Simulator funktioniert alles einwandfrei.
Nach der Nachricht von @SchmadenSchmuki habe ich einige Tests in meinem Projekt durchgefĂŒhrt, und dies ist mein Fazit: Es stimmt etwas nicht mit dem Google Maps-Plugin, das das Geolocator-Plugin betrifft. Zwischen ihnen besteht eine InkompatibilitĂ€t.
Dies ist der Ablauf meiner App, wenn ich sie zum ersten Mal starte:
Bei diesem Flow schlĂ€gt die App fehl. Die 'getCurrentPosition()'-Methode von Geolocator schlĂ€gt fehl, sie gibt niemals einen Wert zurĂŒck. HINWEIS: Die Methoden âisLocationServiceEnabled()â und âgetLastKnownPosition()â funktionieren einwandfrei.
ABER wenn ich den Fluss Àndere zu:
ES KLAPPT!!!!!
Meine Schlussfolgerung ist also, dass das Google Maps-Plugin in gewisser Weise âetwasâ belegt, das andere Plugins daran hindert, den Geolokalisierungsdienst zu verwenden. Wenn Google Maps gerendert wird, wird dieses "Etwas" freigegeben, und dann kann jeder problemlos arbeiten.
Wenn jemand anderes das bestĂ€tigen kann, können wir ein Problem fĂŒr Flutter-Jungs öffnen, um dies zu sehen
@KnucklesEQ vielen Dank fĂŒr die umfangreiche Berichterstattung. Ich werde mit dem Debuggen dieses Problems beginnen und mehr Zeit damit verbringen, das Problem zu reproduzieren und hoffentlich zu beheben. Es wĂ€re sehr hilfreich, wenn andere hier ĂŒberprĂŒfen könnten, ob sie alle auch das Google Maps-Plug-in verwenden.
Trotzdem denke ich, dass es mehrere Probleme gibt (Unterschiede zwischen Android 9 + Android 10, iOS braucht manchmal viele Sekunden, um einen Standort zurĂŒckzugeben, wenn Geolocator in Kombination mit Google Maps verwendet wird) und ich werde mich auf all diese konzentrieren und sehen, ob ich kann die Situation verbessern. Dies wird jedoch einige Zeit dauern, also haben Sie bitte Geduld mit mir, wĂ€hrend ich mein Bestes gebe und versuchen werde, hier Updates ĂŒber meine Fortschritte zu hinterlassen.
Ich verwende das Maps-Plugin nicht. Mir ist aufgefallen, dass, wenn ich die Berechtigung nur erteile, wĂ€hrend die App ausgefĂŒhrt wird (locationWhenInUse), das nĂ€chste Mal, wenn ich frage, sie nicht angezeigt wird und nie aufgelöst wird (nur Android, auf IOS hat es nie funktioniert, seit ich dieses Problem geöffnet habe).
Ich verwende kein Google Maps-Plugin.
Ich verwende auch kein Google Maps-Plugin.
(Bei Problemen habe ich ĂŒberprĂŒft, ob die Google Maps-App auch Probleme hat, den Standort zu erhalten, und dann habe ich gesehen, dass das Abrufen des Standorts dort Auswirkungen auf meine App hatte.)
mehr Details:
Das Problem tritt auf, wenn die folgenden Bedingungen zutreffen
Ich habe es durch den Code verfolgt und was passiert, ist, dass unter den ersten beiden Bedingungen der Standortanbieter, der ausgewĂ€hlt wird, âGPSâ ist und das GerĂ€t das GPS-Signal im Inneren einfach nicht empfangen kann. Ich trat auf den Balkon und fast sofort funktionierten die Dinge normal.
Ich habe nicht versucht, mit der Standortgenauigkeit zu spielen, um zu sehen, wie sich dies auf die Auswahl des Standortanbieters auswirkt, aber ich habe versucht, den Anbieter einfach zum âNetzwerkenâ zu zwingen (durch Hardcoding). Das funktioniert, aber die Genauigkeit des abgerufenen Standorts war offensichtlich nicht sehr gut - ~ 1080 Meter.
@minusminuszero hat recht, mir geht es genauso.
FĂŒr mich tut es also, was es sollte, auch sofort nach dem Neustart, entschuldigen Sie die Unannehmlichkeiten.
(Ich setze den Location Manager nicht, also ist es in meinem Fall forceAndroidLocationManager = false. Ich verwende LocationAccuracy.best und denke, es wĂŒrde auch mit LocationAccuracy.high funktionieren, funktioniert wahrscheinlich nicht fĂŒr niedrigere Genauigkeiten, da in diesen FĂ€llen das locationsymbol wird nicht in der Statusleiste angezeigt, aber dafĂŒr gibt es bereits ein Problem.)
Ich erlebe das Obige auch, mit genau den gleichen Schritten zum Reproduzieren (im Inneren sein, Standardstandort gemÀà usw.)
mehr Details:
Das Problem tritt auf, wenn die folgenden Bedingungen zutreffen
- Ich verwende den Standortmanager (Geolocator().forceAndroidLocationManager = true)
- Ich verwende die Standard-Standortgenauigkeit, nÀmlich LocationAccuracy.best
- ich bin drinnen
Ich habe es durch den Code verfolgt und was passiert, ist, dass unter den ersten beiden Bedingungen der Standortanbieter, der ausgewĂ€hlt wird, âGPSâ ist und das GerĂ€t das GPS-Signal im Inneren einfach nicht empfangen kann. Ich trat auf den Balkon und fast sofort funktionierten die Dinge normal.
Ich habe nicht versucht, mit der Standortgenauigkeit zu spielen, um zu sehen, wie sich dies auf die Auswahl des Standortanbieters auswirkt, aber ich habe versucht, den Anbieter einfach zum âNetzwerkenâ zu zwingen (durch Hardcoding). Das funktioniert, aber die Genauigkeit des abgerufenen Standorts war offensichtlich nicht sehr gut - ~ 1080 Meter.
Wie sind Sie vorgegangen, um den Standort "Netzwerk" zu erzwingen? Dies wĂŒrde fĂŒr mich ausreichen, um das Problem zu beheben, da es zumindest in InnenrĂ€umen auftritt
Wie sind Sie vorgegangen, um den Standort "Netzwerk" zu erzwingen? Dies wĂŒrde fĂŒr mich ausreichen, um das Problem zu beheben, da es zumindest in InnenrĂ€umen auftritt
Ich tat dies, indem ich den Wert fĂŒr den Standortanbieter direkt im Geolocator-Plug-in-Code hartkodierte. Ich nehme an, die Wahl der niedrigen Genauigkeit hĂ€tte den gleichen Effekt, aber ich habe es nicht versucht.
Wahrscheinlich sollte die Methode einen Timeout-Parameter haben, oder?
Arbeitet das Flutter/Geolocator-Team an diesem Problem?
ja wir sind
Danke @mvanbeusekom!
Wissen Sie, was die Ursache des Problems ist?
Haben Sie einen Weg gefunden, es zu umgehen (oder eine Art vorĂŒbergehende Lösung)?
(Downgrade auf 4.0.3 hat es fĂŒr uns nicht gelöst)
Auf dem Simulator ist es wichtig, den Simulator so zu konfigurieren, dass er einen Standort ausgibt. Dies kann ĂŒber die folgenden MenĂŒpunkte der Simulatoranwendung erfolgen: Funktionen -> Ort -> (wĂ€hlen Sie eine andere Option als "keine").
Das hat das Problem fĂŒr mich behoben. Aber es ist ein sehr verwirrender Fehler, da er einfach ohne Ausnahmen oder irgendetwas fehlschlĂ€gt.
Auf dem Simulator ist es wichtig, den Simulator so zu konfigurieren, dass er einen Standort ausgibt. Dies kann ĂŒber die folgenden MenĂŒpunkte der Simulatoranwendung erfolgen: Funktionen -> Ort -> (wĂ€hlen Sie eine andere Option als "keine").
Das hat das Problem fĂŒr mich behoben. Aber es ist ein sehr verwirrender Fehler, da er einfach ohne Ausnahmen oder irgendetwas fehlschlĂ€gt.
Ja, fĂŒr mich auch.
Bitte fĂŒgen Sie eine ZeitĂŒberschreitung in der Standortanforderung hinzu und lösen Sie eine Ausnahme im Simulator aus, fĂŒr den kein Standort festgelegt ist.
Danke :)
Ich habe das gleiche Problem unter iOS, ich verwende auch das Google Maps-Plugin.
Ich habe eine App, die getLocationStream verwendet, aber ich erhalte keinen Berechtigungsdialog, bis ich auf die Registerkarte gehe, auf der ich eine Google-Karte habe.
Ich habe eine andere App, bei der ich Google Maps nicht mehr verwendet habe, aber vergessen habe, das Plugin zu entfernen, und ich hatte das gleiche Problem. Ich habe das Google Maps Plugin entfernt und jetzt funktioniert es richtig.
Irgendwelche Updates dazu?
Hallo zusammen, ich arbeite mit Hochdruck an diesem Problem. GrundsÀtzlich haben wir uns entschieden, den Geolocator von Grund auf neu zu bauen und mehrere Probleme auf einmal zu beheben.
Punkte, die enthalten sein werden, sind:
getCurrentLocation
innerhalb einer angemessenen Zeit abgerufen wird;getCurrentLocation
und getPositionStream
eine ZeitĂŒberschreitung hinzu, sodass die Anforderung eine ZeitĂŒberschreitung erleidet, wenn das Erfassen des Standorts lĂ€nger als erwartet dauert, und Sie die Anforderung neu starten können.Der erste Schritt bestand darin, die Geokodierungsfunktionen auszubauen und sie in einem eigenen Plugin zu hosten (das jetzt auf pub.dev verfĂŒgbar ist.
Der zweite Schritt bestand darin, den gesamten erforderlichen Dart-Code zu erstellen und zu testen, der nun fertig ist und im Zweig federated_plugin angezeigt werden kann.
Die nĂ€chsten Schritte bestehen darin, iOS- und Android-Implementierungen hinzuzufĂŒgen und die Beispiel-App zu reparieren. Daran arbeite ich gerade, hoffentlich schaffe ich es in den nĂ€chsten zwei Wochen alles fertig zu stellen (bitte bedenkt, dass ich das auch in meiner Freizeit machen muss ;)).
Wie auch immer, ich möchte allen fĂŒr ihre Geduld und ihr Feedback danken, bitte warten Sie noch ein bisschen.
@mvanbeusekom
Das sind gute Neuigkeiten. Ich freue mich, dass Sie sich die Zeit nehmen, uns dieses Plugin zur VerfĂŒgung zu stellen.
Ein groĂes Dankeschön geht an Sie!
Ich freue mich auf die folgenden Updates.
Danke und viele GrĂŒĂe
HĂŒbsch! Lassen Sie uns wissen, wann es veröffentlicht wird, damit wir es testen können.
Als vorĂŒbergehenden Workaround können Sie den Status am GerĂ€t mit der Methode GeolocationStatus checkGeolocationPermissionStatus()
prĂŒfen. Wenn der Standort deaktiviert ist, gibt diese Methode âdeaktiviertâ zurĂŒck. Dann mĂŒssen Sie die Methode getCurrentPosition()
nicht aufrufen.
Beispiel:
Future<Position> getCurrentPosition() async {
Position position;
GeolocationStatus status = await _geolocator.checkGeolocationPermissionStatus();
if (status != GeolocationStatus.disabled) {
position = await _geolocator.getLastKnownPosition();
if (position == null && status == GeolocationStatus.granted) {
position = await _geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high,
locationPermissionLevel: GeolocationPermission.locationWhenInUse,
);
}
}
return position;
}
Kleines Update hier, heute Morgen habe ich ein neues Update fĂŒr den federated_plugin -Zweig veröffentlicht, das volle UnterstĂŒtzung fĂŒr iOS einschlieĂlich einer Flutter-Beispiel-App enthĂ€lt.
Wir haben auch mit der Arbeit an Android begonnen, das die ĂberprĂŒfung des Berechtigungsstatus unterstĂŒtzt. Wir werden jetzt das Anfordern von Berechtigungen implementieren und Ortungsdienste handhaben.
Sie können sich den Code gerne ansehen oder sogar versuchen, ihn in eine Test-App zu integrieren und auf iOS auszufĂŒhren. Beachten Sie, dass es eine ganze Reihe von Breaking Changes enthĂ€lt, die alle dokumentiert werden. Im Moment wollte ich nur alle wissen lassen, dass es Fortschritte gibt, obwohl es einige Zeit dauert. Nochmals vielen Dank fĂŒr all Ihre Geduld.
Kleines Update hier, heute Morgen habe ich ein neues Update fĂŒr den federated_plugin -Zweig veröffentlicht, das volle UnterstĂŒtzung fĂŒr iOS einschlieĂlich einer Flutter-Beispiel-App enthĂ€lt.
Wir haben auch mit der Arbeit an Android begonnen, das die ĂberprĂŒfung des Berechtigungsstatus unterstĂŒtzt. Wir werden jetzt das Anfordern von Berechtigungen implementieren und Ortungsdienste handhaben.
Sie können sich den Code gerne ansehen oder sogar versuchen, ihn in eine Test-App zu integrieren und auf iOS auszufĂŒhren. Beachten Sie, dass es eine ganze Reihe von Breaking Changes enthĂ€lt, die alle dokumentiert werden. Im Moment wollte ich nur alle wissen lassen, dass es Fortschritte gibt, obwohl es einige Zeit dauert. Nochmals vielen Dank fĂŒr all Ihre Geduld.
Danke, dass Sie hart daran gearbeitet haben. Werden Sie das Geolocator-Paket auf pub.dev mit dieser Ănderung aktualisieren?
Ist dies auch die Datei fĂŒr das oben erwĂ€hnte Beispiel: position_updates_example_widget.dart?
Danke, dass Sie hart daran gearbeitet haben. Werden Sie das Geolocator-Paket auf pub.dev mit dieser Ănderung aktualisieren?
Ist dies auch die Datei fĂŒr das oben erwĂ€hnte Beispiel: position_updates_example_widget.dart?
Nein, ich werde noch nicht auf pub.dev veröffentlichen. Dies ist eine vollstĂ€ndige Ăberarbeitung des Geolocator-Plugins und unterstĂŒtzt Android noch nicht. Sobald Android und die Dokumentation fertig sind, werde ich es auf pub.dev veröffentlichen.
Ja, dieses Widget ist Teil der Beispiel-App und zeigt, wie Sie auf Positionsaktualisierungen hören können.
Hallo,
Danke fĂŒr dieses Paket.
Gibt es eine Chance, alle oben genannten Aufgaben fĂŒr Android in dieser Woche zu erledigen?
Gibt es hierzu Neuigkeiten?
Nur auf Standortverzögerung warten, wenn die Anfrage zum ersten Mal gestellt wird.
Irgendwelche Neuigkeiten darĂŒber, wann die ĂŒberarbeitete Version veröffentlicht wird? @mvanbeusekom
@dalmia007 , ich habe noch kein Datum, aber es werden Fortschritte gemacht. Ich habe rudimentĂ€re UnterstĂŒtzung fĂŒr Android auf dem Zweig feature/federated_android
hinzugefĂŒgt. Es enthĂ€lt das Anfordern von Berechtigungen, das Abrufen des letzten bekannten Standorts, das Abrufen des aktuellen Standorts und Standortaktualisierungen, die alle den Anbieter-Client fĂŒr verschmolzene Standorte (Teil der Google Play-Dienste) verwenden.
An folgendem arbeite ich noch:
Android-spezifisch:
Allgemein:
Schauen Sie es sich gerne hier an
@mvanbeusekom vielen Dank fĂŒr das Update! đ
Hallo zusammen,
Ich freue mich, die von mir (endlich) veröffentlichte Version 6.0.0-rc.1 ankĂŒndigen zu können, die all diese Probleme beseitigen sollte.
Ich wĂŒrde mich sehr freuen, wenn Sie es ausprobieren und mir Ihr Feedback geben könnten.
Es tut mir leid, dies zu sagen, aber es ist jetzt zweimal abgestĂŒrzt, genug, um bereits auf 4.0.3 zurĂŒckzukehren.
E/AndroidRuntime(19881): java.lang.RuntimeException: Failure delivering result ResultInfo{who=<strong i="6">@android</strong>:requestPermissions:, request=24, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.packagename.consumer.app/com.packagename.consumer.app.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void com.baseflow.geolocator.permission.PermissionResultCallback.onResult(com.baseflow.geolocator.permission.LocationPermission)' on a null object reference
Ist passiert, als ich im Dialog Allow Grant gedrĂŒckt habe und auch, als ich Deny gedrĂŒckt habe. Lassen Sie mich wissen, wenn ich etwas verpasst habe.
@Dohmanlechx nur um sicherzugehen, hast du das auf 6.0.0-rc.x oder auf der Version 5.3.2 bekommen?
Ich habe das auf 6.0.0-rc.1
bekommen (die IDE hat mich gebeten, auf 5.3.2+2
zu "aktualisieren", zu Ihrer Information)
@Dohmanlechx Dank Ihres Feedbacks habe ich ein Problem gefunden. Anscheinend erhÀlt der Geolocator in Ihrem Fall Feedback von einem anderen Plugin (ich vermute, Sie verwenden den permission_handler, um Berechtigungen zu verarbeiten, da der requestCode == 24 derselbe wie der permission_handler ist), das er zu verarbeiten versucht, was offensichtlich fehlschlÀgt. In diesen FÀllen sollte der Geolocator diese Nachrichten einfach ignorieren, da sie nicht zum Geolocator gehören. Ich werde das heute beheben und einen neuen Release Candidate veröffentlichen.
Vielen Dank fĂŒr Ihre RĂŒckmeldung!
Oh, tatsÀchlich, wir verwenden permission_handler
. Guter Fund!
Alle Credits gehen an dich @Dohmanlechx ;). Dank Ihres Feedbacks konnte ich diesen Fehler entdecken und werde in KĂŒrze eine neue Version veröffentlichen können.
@Dohmanlechx Ich habe gerade Version 6.0.0-rc.3 veröffentlicht, die den aufgetretenen Fehler beheben sollte.
Sehr cool, sorgfÀltig auf dem Android-Emulator getestet, GewÀhren & Verweigern, Manipulieren des Standorts, funktionierte perfekt. Hat auch auf meinem echten Android-GerÀt gut funktioniert.
Aber es wird ĂŒberhaupt keine Systemanforderung fĂŒr den iOS-Simulator angezeigt, schĂ€tze, es ist beabsichtigt? Es stĂŒrzt jedoch zumindest nicht ab und die App funktioniert wie gewĂŒnscht, ohne dass ein Standort verfĂŒgbar ist. Leider kann ich aufgrund eines Xcode-Verbindungsproblems immer noch nicht auf meinem iPhone testen, und ich möchte keinen Build fĂŒr TestFlight bereitstellen, nur um jetzt zu testen. Werde berichten, sobald ich es auf dem iPhone getestet habe.
Aber so weit, so gut!
Vielen Dank fĂŒr das ausgiebige Testen @Dohmanlechx , es wird sehr geschĂ€tzt!
Das Plugin zeigt tatsĂ€chlich keine Dienstanfrage auf iOS, da es keine (öffentliche) API dafĂŒr gibt. Die einzige Möglichkeit, die wir hier haben, besteht darin, dem Benutzer manuell eine Meldung anzuzeigen, die erklĂ€rt, wie die Einstellungen manuell aktualisiert werden können. Wir haben eine Option, um den Benutzer zur App âEinstellungenâ umzuleiten (durch Aufrufen der Methoden openAppSettings()
oder openLocationSettings()
). Ich habe dies ausfĂŒhrlicher in der Datei README.md dokumentiert.
Ich bedauere, dies mitteilen zu mĂŒssen, aber es hat auf meinem iPhone XS Max, OS 13.6.1, wie eine Katastrophe funktioniert.
Das erstmalige Abrufen der Position funktionierte genauso wie in der alten Version, gab die korrekte Position zurĂŒck, dauerte aber immer noch 7-8 Sekunden.
Aber ab dem zweiten Mal und weiter warf es sofort weiter. Ich musste aus folgenden GrĂŒnden von Exception err
zu dynamic err
wechseln:
_ Unbehandelte Ausnahme: Typ '_TypeError' ist kein Untertyp des Typs 'Exception' _.
Ich bekomme diese, wenn es fehlschlÀgt (nach dem ersten Abrufen):
2020-08-26 14:01:45.670206+0200 Runner[4565:206487] Flattern: Standort konnte nicht abgerufen werden: Schlechter Zustand: Kein Element
2020-08-26 14:01:45.670416+0200 Runner[4565:206487] Flattern: Standort konnte nicht abgerufen werden: Instanz von âNoLocationFoundExceptionâ
( NoLocationFoundException
ist meine benutzerdefinierte Klasse)
_Schlechter Zustand: Kein Element_ sagt leider nicht viel aus ... unten ist mein Code:
static Future<void> _getUserLocation({bool isSneaky = false}) async {
void _throw(dynamic err) {
print("Could not fetch location: $err");
if (!isSneaky) Fluttertoast.showToast(msg: getTranslation("location_fetch_error"));
throw NoLocationFoundException();
}
await GeolocatorPlatform.instance
.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high,
timeLimit: const Duration(seconds: _TIMEOUT_DELAY),
)
.then((position) => _userLatestPosition = position)
.catchError(
(err) {
// Debug only, remove later
Fluttertoast.showToast(msg: "error: $err");
if (err is TimeoutException) {
GeolocatorPlatform.instance.getLastKnownPosition().then((position) {
if (position == null) _throw(err);
return position;
}, onError: (err) {
_throw(err);
});
} else if (err is PermissionDeniedException) {
XxlPermissionsHandler.request(Permission.location);
} else {
_throw(err);
}
},
).catchError((err) => _throw(err));
}
Ich hoffe aufrichtig, dass Sie dies auf Ihrem iPhone reproduzieren können.
@Dohmanlechx , danke fĂŒr das umfangreiche Feedback, ich glaube ich habe das Problem hier gefunden. Jetzt muss ich eine gute Lösung finden ;)
Kurz gesagt, die Methode getCurrentPosition
ruft die Methode getPositionStream
, nimmt das erste Element und schlieĂt dann den Stream. Das Problem ist, dass getPositionStream
Code wie diesen hat:
if (_positionStream != null) {
return _positionStream;
}
Was Sie erraten können, verursacht die Bad state: No element
-Ausnahme beim zweiten Aufruf von getCurrentPosition
, da es first
in einem bereits geschlossenen Stream aufruft. Ich werde daran arbeiten und bald einen neuen Kandidaten veröffentlichen.
@Dohmanlechx , Ihr Problem, bei dem Sie den "Schlechter Zustand: Kein Element" erhalten, sollte in 6.0.0-rc.4 behoben worden sein, das ich gerade veröffentlicht habe. Ich konnte das Problem nicht reproduzieren, aber ich konnte sicherstellen, dass das getCurrentPosition
einen neuen Stream verwendet, wenn Sie es ein zweites Mal (und jedes weitere Mal) aufrufen.
Ich wĂŒrde es wirklich schĂ€tzen, wenn Sie es noch einmal versuchen und mich wissen lassen, ob es funktioniert.
Was mir aufgefallen ist, ist, dass Sie GeolocatorPlatform.instance.<some_method>
direkt verwenden. Auf diese Weise ĂŒbergeben Sie jede Logik, die sich im Paket geolocator
befindet, und gehen direkt zur Standardimplementierung, die sich in geolocator_platform_instance
befindet geolocator
, aber es ist immer noch besser, es nicht zu umgehen.
Wenn Sie das Geolocator-Paket importieren, sollten Sie die globalen Methoden direkt aufrufen können, zum Beispiel:
import 'package:geolocator/geolocator.dart';
final position = await getCurrentPosition();
Wenn Sie auf Kollisionen stoĂen oder den globalen Methoden einfach ein PrĂ€fix voranstellen möchten, können Sie dem Import einen Alias ââhinzufĂŒgen, etwa so:
import 'package:geolocator/geolocator.dart' as geolocator;
final position = await geolocator.getCurrentPosition();
Danke, ich habe auch den Code gemÀà Ihren VorschlÀgen geÀndert.
Der Absturz ist jetzt weg, aber leider immer noch zu instabil. 3 von 10 Mal ist es extrem schnell (ich wĂŒnschte wirklich, es wĂ€re 10 von 10 Mal), aber 7 von 10 Mal ĂŒberschreitet das Zeitlimit (10 Sekunden) und die Funktion wirft. Haben Sie auf Ihrem iPhone getestet und das getCurrentPosition()
? Getestet habe ich auf iPhone XS Max, OS 13.6.1.
_4.0.3_ ist langsam, aber stabil
_6.0.0-rc.4_ ist schnell, aber instabil
Aber keine Sorge, das ist völlig in Ordnung und absolut keine Katastrophe fĂŒr uns, zumal ich fĂŒr die Version 4.0.3 ein eigenes Zeitlimit geschrieben habe.
@Dohmanlechx freut mich zu hören, dass der Absturz behoben ist, das ist zumindest etwas;)
Mich interessiert wirklich, warum Sie immer noch langsame Updates erhalten, da ich es nicht reproduzieren kann. Ich habe eine sehr einfache Demo-App erstellt, um sie auszuprobieren:
main.dart:
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
<strong i="10">@override</strong>
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
List<Position> _positions = <Position>[];
<strong i="11">@override</strong>
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: Scaffold(
body: ListView.builder(
itemCount: _positions.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(title: Text(_positions[index].toString()),);
},),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () => getCurrentPosition().then((position) {
setState(() {
_positions.add(position);
});
}),
),
),
);
}
}
Info.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>geolocator_issue</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>NSLocationWhenInUseUsageDescription</key>
<string>The example App requires access to the device's location.</string>
</dict>
</plist>
Jedes Mal, wenn ich also auf die schwebende AktionsschaltflĂ€che drĂŒcke, wird getCurrentPosition
aufgerufen und das Ergebnis zu ListView
hinzugefĂŒgt. Ich habe diese App auf meinem persönlichen iPhone 7, dem iPhone 6 meiner Frau und dem Simulator (alle mit der neuesten iOS-Version) getestet, aber ich kann die SchaltflĂ€che spammen und der Standort wird fast sofort zurĂŒckgegeben. Ich bin wirklich verwirrt, warum Sie eine andere Erfahrung haben. Vielleicht können Sie diesen Beispielcode testen und sehen, ob Sie immer noch das gleiche Problem haben?
Ich bewundere deine HartnĂ€ckigkeit sehr. Ich habe ein neues Projekt erstellt und Ihre Codes verwendet, den iPhone-Bildschirm fast kaputt gemacht, indem ich die SchaltflĂ€che spammte, der Standort kehrte die ganze Zeit sofort zurĂŒck. Fantastisch! Morgen werde ich versuchen, Zeit fĂŒr die Fehlersuche in unserem Code zu finden, beginnend mit dem AusfĂŒhren getCurrentPosition()
direkt im Widget und dann immer weiter weg bis zu seinem vorgesehenen Platz, um den ĂbeltĂ€ter zu finden. Ich vermute, es liegt am Berechtigungs-Plugin, aber wir werden sehen.
Danke fĂŒr das Feedback und die netten Worte, das freut mich sehr. Ich habe mich sehr bemĂŒht, den Geolocator neu zu erstellen, und dieses Problem war es, das mich wirklich dazu veranlasst hat, ihn zu starten, also möchte ich, dass er dieses Mal wirklich gut wird ;)
Bitte lassen Sie mich wissen, wie es geht und wenn ich helfen kann.
getCurrentPosition().then((position) {
print(position);
}).catchError((err) {
print(err);
});
Habe dies direkt im Widget versucht und jedes Mal, wenn ich geklickt habe, wurde ein Standort auf der Konsole angemeldet! Es ist also definitiv unser Code. Also liegt es jetzt an uns, danke fĂŒr alles!
Dies passiert jedoch _manchmal_ beim Abrufen der Position:
I/flutter ( 393): ââ⥠EXCEPTION CAUGHT BY SERVICES LIBRARY âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
I/flutter ( 393): The following PlatformException was thrown while de-activating platform stream on channel
I/flutter ( 393): flutter.baseflow.com/geolocator_updates:
I/flutter ( 393): PlatformException(error, No active stream to cancel, null)
I/flutter ( 393):
I/flutter ( 393): When the exception was thrown, this was the stack:
I/flutter ( 393): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:572:7)
I/flutter ( 393): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:161:18)
I/flutter ( 393): <asynchronous suspension>
I/flutter ( 393): #2 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:334:12)
I/flutter ( 393): #3 EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:554:29)
I/flutter ( 393): #4 EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:551:18)
I/flutter ( 393): #18 MethodChannelGeolocator.getPositionStream.<anonymous closure> (package:geolocator_platform_interface/src/implementations/method_channel_geolocator.dart:135:13)
I/flutter ( 393): (elided 24 frames from class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)
I/flutter ( 393): ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
@mvanbeusekom Ich kann die Position mit der neuesten Version 6.0.0 + 1 ĂŒberhaupt nicht abrufen. Versucht auf iOS-Simulator, Android-Emulator API 29, physischem OnePlus 6. Timeout wird jedes Mal ausgelöst.
Ich weiĂ nicht, was ich hier noch hinzufĂŒgen kann, um Sie beim Auffinden des Problems zu unterstĂŒtzen. getCurrentPosition
gibt eine ZeitĂŒberschreitung zurĂŒck oder hĂ€ngt einfach, wenn der Parameter timeLimit
nicht angegeben ist. Ich habe verschiedene Standortgenauigkeiten ausprobiert. Hat jemand dieses Problem?
Version 5.3.2+2 funktioniert gut auf dem iOS-Simulator (mit dem benutzerdefinierten Speicherort), dem Android-RealgerÀt und dem Android-Emulator
@mvanbeusekom , ich habe das alles durchgelesen und aktualisiere auf die neueste Version, um das Problem mit der 10-Sekunden-Verzögerung zu beheben.
Vielleicht ĂŒbersehe ich etwas, aber es gibt etwas, das ich in der neuen Version nicht mehr tun kann (Geocodierung).
FrĂŒher konnte ich manuell eine Position auf das Stadtzentrum setzen (falls der Benutzer den Standort verweigert), indem ich Folgendes tat:
Position userLocation;
List<Placemark> listAddresses = [];
if(permission.toString() != "PermissionStatus.granted"){
listAddresses = await placemarkFromAddress("$city, $state");
userLocation = listAddresses[0].position;
}else{
getCurrentPosition...
}
Jetzt scheint _placemarkFromAddress_ in _ locationFromAddress _ geĂ€ndert worden zu sein, also habe ich versucht, mich anzupassen, indem ich die folgenden Ănderungen in meiner Formel vorgenommen habe:
Position userLocation;
List<Location> listAddresses = [];
if(permission.toString() != "PermissionStatus.granted"){
listAddresses = await locationFromAddress("$city, $state");
userLocation = listAddresses[0].position;
}else{
getCurrentPosition...
}
Aber ich bekomme folgenden Fehler:
A value type 'Location' can't be assigned to a variable of type 'Position'.
Wie kann ich den Standort in die Position umwandeln oder letztendlich, falls der Benutzer den Standort verneint, wie kann ich seine Position jetzt auf sein Stadtzentrum setzen?
Danke.
Ich habe auf die neueste Version aktualisiert, das Problem fĂŒr mich behoben đđđ
Hilfreichster Kommentar
Hallo zusammen,
Ich freue mich, die von mir (endlich) veröffentlichte Version 6.0.0-rc.1 ankĂŒndigen zu können, die all diese Probleme beseitigen sollte.
Ich wĂŒrde mich sehr freuen, wenn Sie es ausprobieren und mir Ihr Feedback geben könnten.