Запрашивать разрешение на определение местоположения несколько раз flutter

#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. Оооо, хорошо, я понял тебя, спасибо, приятель!