Flutter: как анимировать камеру Google Maps

#google-maps #flutter #google-maps-api-3

#google-карты #флаттер #google-maps-api-3

Вопрос:

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

Мне пришла в голову эта идея (код ниже), но она работает, только если я перезапущу приложение, и если я этого не сделаю, выдает ошибку: animateCamera была вызвана с нулевым значением.

Как это возможно? и как я могу это исправить?

Спасибо за ответ: D

 ...

var mapController;

...

GoogleMap createMap() {
    var initMap = GoogleMap(
      onMapCreated: onMapCreated,
      initialCameraPosition:
          CameraPosition(target: LatLng(47.290542, 8.322641), zoom: 6.7),
    );
    return initMap;
  }
  
  ...

  void onMapCreated(controller) {
    mapController = controller;
  }
 
 ...
 
   void moveCameraToUserLocation(searchedLocation2) async {
    var location = await Geocode().getLatLng(searchedLocation2);
    print("moving to: $location");
    mapController.animateCamera(
      CameraUpdate.newCameraPosition(
        CameraPosition(
          target: location,
          zoom: 20,
        ),
      ),
    );
    
 ...
 
 build(context) {

    return Scaffold(

      body: createMap(),

...  

Ответ №1:

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


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

В следующем фрагменте кода используется ClipOval кнопка, и внутри OnTap() события вы можете вызвать метод для получения текущего местоположения устройства, который будет срабатывать при каждом нажатии кнопки.

 ClipOval(
   child: Material(
   color: Colors.green[100], // button color
   child: InkWell(
   splashColor: Colors.green, // inkwell color
   child: SizedBox(
   width: 56,
   height: 56,
   child: Icon(Icons.my_location),
   ),
   onTap: () {

    // Add methods here that will be called whenever the button is tapped 

    mapController.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(
    target: LatLng(_currentPosition.latitude, _currentPosition.longitude),
    zoom: 17.0)));
    setState(() {
    allMarkers.add(Marker(
      markerId: MarkerId('Current Position'),
      draggable: false,
      position:
          LatLng(_currentPosition.latitude, _currentPosition.longitude)));
        });
      },
    ),
  ),
)
  

Ответ №2:

Возможно, вы вызываете функцию moveCameraToUserLocation перед созданием карты. Из этой части кода я не могу понять, когда вы вызываете эту функцию, но я предполагаю, что вы вызываете ее из initstate. Если вы хотите вызвать эту функцию сразу после создания виджета, переместите ее в onMapCreated.

 void onMapCreated(controller) {
   mapController = controller;
   moveCameraToUserLocation();
}