Не удается загрузить текущее местоположение в приложении Flutter - PullRequest
1 голос
/ 03 июля 2019

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

void initState() {
// TODO: implement initState
super.initState();
getCurrentLocation();

}

void getCurrentLocation() async {
var answer = await Geolocator().getCurrentPosition();
setState(() {
  latitude = answer.latitude;
  longitude = answer.longitude;
});

}

Карта обновляется с текущим местоположением через несколько миллисекунд, но отображаются эти ошибки.I / трепетание (14143): ══╡ ИСКЛЮЧЕНИЕ, ВЫДЕЛЕННОЕ БИБЛИОТЕКОЙ ВИДЖЕТОВ═════════════════════════

I / flutter (14143): Следующее утверждение было брошено зданием HomePage (грязное, состояние:_HomePageState # d55de):

I / flutter (14143): 'package: google_maps_flutter / src / location.dart': ошибочное утверждение: строка 17 поз 16: 'широта! =

I /flutter (14143): null ': не соответствует действительности.

I / flutter (14143):

I / flutter (14143): Либо утверждение указывает на ошибку в самой платформе, либомы должны предоставить по существу

I / флаттер (14143): дополнительную информацию в этом сообщении об ошибке, чтобы помочь вам определить и устранить основную причину.

I / флаттер (14143): В любом случае,пожалуйста, сообщите об этом утверждении, отправив сообщение об ошибке на GitHub:

Ответы [ 3 ]

0 голосов
/ 04 июля 2019

Я пробовал много способов, пока не нашел этот путь благодаря доброму человеку, который помогал в другой группе флаттера в фейсбуке. Убедитесь, что в вашем pubspec.yaml вы обновили местоположение до последней версии

зависимости: местоположение: ^ 2.3.5 Затем измените его на следующий код:

 
  LocationData _currentLocation;
  StreamSubscription<LocationData> _locationSubscription;

  var _locationService = new Location();
  String error;

  void initState() {
    super.initState();

    initPlatformState();

    _locationSubscription = _locationService
        .onLocationChanged()
        .listen((LocationData currentLocation) async {
      setState(() {
        _currentLocation = currentLocation;
      });
    });
  }

  void initPlatformState() async {
    try {
      _currentLocation = await _locationService.getLocation();


    } on PlatformException catch (e) {
      if (e.code == 'PERMISSION_DENIED') {
        error = 'Permission denied';
      }else if(e.code == "PERMISSION_DENIED_NEVER_ASK"){
        error = 'Permission denied';
      }
      _currentLocation = null;
    }
 Run code snippetReturn to post

Вы можете получить долготу и широту как

_currentLocation.longitude и _currentLocation.latitude

они вернут двойные значения. Кроме того, в https://pub.dev/packages/location#-readme-tab-

доступны дополнительные параметры
0 голосов
/ 05 июля 2019

По предложению Abbas.M я решаю свою проблему с помощью виджета FutureBuilder.

Виджет FutureBuilder: https://www.youtube.com/watch?v=ek8ZPdWj4Qo

Я объявляю переменную _future

Future<Position> _future;

Я вызываю мой асинхронный метод в initState

void initState() {
// TODO: implement initState
super.initState();
_future = getCurrentLocation();
}

Используя виджет FutureBuilder, я решил свою проблему и передаю возвращаемое значение асинхронной функции параметру виджета FutureBuilder.

Это условие, если (snapshot.connectionState == ConnectionState.done) помогает найти нашу асинхронную функцию завершенной и возвращает значение или нет. если он находится в состоянии «Готово», значит, функция завершена и возвращена.

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

Widget build(BuildContext context) {
return Scaffold(
    appBar: AppBar(
      title: Text("Flutter Krish"),
    ),
    body: FutureBuilder(
        future: _future,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            if (!snapshot.hasError) {
              print(snapshot.data.latitude);
              return Stack(children: <Widget>[
                GoogleMap(
                  initialCameraPosition: CameraPosition(
                      target: LatLng(
                          snapshot.data.latitude, snapshot.data.longitude),
                      zoom: 12.0),
                  onMapCreated: mapCreated,
                ),
                Positioned(
                  top: 30.0,
                  left: 15.0,
                  right: 15.0,
                  child: Container(
                    height: 50.0,
                    width: double.infinity,
                    decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(10.0),
                        color: Colors.white),
                    child: TextField(
                      decoration: InputDecoration(
                          border: InputBorder.none,
                          hintText: 'Enter Address',
                          contentPadding:
                              EdgeInsets.only(top: 15.0, left: 15.0),
                          suffixIcon: IconButton(
                            icon: Icon(Icons.search),
                            onPressed: searchAndNavigate,
                            iconSize: 30.0,
                          )),
                      onChanged: (value) {
                        searchAddress = value;
                      },
                    ),
                  ),
                ),
              ]);
            }
          } else {
            return Center(child: CircularProgressIndicator());
          }
        }));
}

Future<Position> getCurrentLocation() async
{
var answer = await Geolocator().getCurrentPosition();
return answer;
}
0 голосов
/ 03 июля 2019

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

void initState() {
// TODO: implement initState
super.initState();
latitude = 0;
longitude = 0;
getCurrentLocation().then((k) {
  latitude = k.latitude;
  longitude = k.longitude;
  setState(() {});
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...