#ios #flutter #geolocation
#iOS #flutter #геолокация
Вопрос:
Мой код получает местоположение пользователя без ошибок. Проблемы возникают, когда пользователь запрещает доступ к местоположению, а затем он хочет разрешить его. Я не знаю, как справиться с этим процессом.
Это шаги :
- initState для запроса местоположения -> Если пользователь разрешает доступ, все в порядке.
- initState -> пользователи отказывают в доступе. Если пользователь откажет в доступе, я не смогу запросить его снова, поэтому у меня никогда не будет позиции от пользователя. Мне нужно понять, как обрабатывать фазу отказа. Это код :
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:geocoder/geocoder.dart'; import 'package:geolocator/geolocator.dart'; class Maps extends StatefulWidget { static Future<void> show( BuildContext context, ) async { await Navigator.of(context).push( MaterialPageRoute( builder: (context) => Maps(), fullscreenDialog: true, ), ); } @override _MapsState createState() => _MapsState(); } Future<Position> locateUser() async { return Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high); } class _MapsState extends State<Maps> { Geolocator geolocator = Geolocator(); String _location; String _addressLine; bool done = false; @override void initState() { _getCurrentLocation(); super.initState(); } @override Widget build(BuildContext context) { return CupertinoPageScaffold( navigationBar: _navBar(), child: Center( child: Container( height: MediaQuery.of(context).size.height * 0.4, width: MediaQuery.of(context).size.width * 0.6, child: Center( child: Column( children: [ done == false ? textOnScreen("Need to get the position") : textOnScreen("val 1: $_location, val 2: $_addressLine"), FlatButton( child: Text("Get location"), onPressed: () { setState(() { done = false; _getCurrentLocation(); }); }, ), ], ), ), ), ), ); } Widget textOnScreen(String text) { return FlatButton( onPressed: null, child: Text(text), ); } Widget _navBar() { return CupertinoNavigationBar( backgroundColor: Colors.blue, middle: Text( 'Get position', style: TextStyle( color: Colors.white, ), ), ); } Future<void> _getLocation(Position position) async { debugPrint('location: ${position.latitude}'); final coordinates = new Coordinates(position.latitude, position.longitude); List<Address> addresses = await Geocoder.local.findAddressesFromCoordinates(coordinates); Address first = addresses.first; _location = "${first.featureName}"; _addressLine = " ${first.addressLine}"; setState(() { done = true; }); } void _getCurrentLocation() { // if (await ) Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.best) .then((Position position) { _getLocation(position); }).catchError((e) { print(e); }); } }
Комментарии:
1. вам нужно только вызвать ваше местоположение _getCurrentLocation() в вашем методе initState ()
2. Я отредактирую весь код
3. Вам необходимо определить состояние
.denied
авторизации и отобразить какое-либо предупреждение или сообщение, предлагающее пользователю перейти в настройки и изменить разрешение. Невозможно заставить ios запросить еще раз.4. Оооо, хорошо, я понял тебя, спасибо, приятель!