Как анимировать камеру из другого класса с помощью плагина Google Maps Flutter - PullRequest
0 голосов
/ 29 января 2020

У меня есть файл main.dart, в котором я создаю HomePage() с ящиком, списком плиток и картой. Я реализовал плагин Google Maps в другом файле дротика (см. Код ниже), и я просто вызываю MapPage() в теле моего скаффолда в HomePage().

Теперь мне нужно анимировать камеру, когда я нажимаю на одну из плиток списка в своем ящике, вызывая функцию goToLoyola(), поэтому мои вопросы: как я могу получить доступ к этой функции из HomePage()?

Извините, я чувствую, что мой вопрос очень плохой, но я новичок и все еще учусь трепетать. Спасибо.

class MapPage extends StatefulWidget {
  @override
  _MapPageState createState() => _MapPageState();
}

class _MapPageState extends State<MapPage> {
  GoogleMapController _controller;
  LatLng _currentLocation;
  CameraPosition _initialCameraLocation;
  StreamSubscription _locationSubscription;

  Location _location = new Location();
  String error;

  goToLoyola() {
    _controller.animateCamera(CameraUpdate.newCameraPosition(_loyolaCampus));
  }

  @override
  void initState() {
    super.initState();

    initPlatformState();
    _locationSubscription =
        _location.onLocationChanged().listen((newLocalData) {
      setState(() {
        _currentLocation =
            LatLng(newLocalData.latitude, newLocalData.longitude);
        _initialCameraLocation = CameraPosition(
          target: _currentLocation,
          zoom: CAMERA_ZOOM,
          tilt: CAMERA_TILT,
          bearing: CAMERA_BEARING,
        );
      });
    });
  }

  @override
  void dispose() {
    if (_locationSubscription != null) {
      _locationSubscription.cancel();
    }
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    while (_initialCameraLocation == null) {
      return Text("Loading Map");
    }
    return GoogleMap(
        myLocationEnabled: true,
        myLocationButtonEnabled: true,
        compassEnabled: false,
        tiltGesturesEnabled: true,
        mapType: MapType.normal,
        indoorViewEnabled: true,
        trafficEnabled: false,
        initialCameraPosition: _initialCameraLocation,
        onMapCreated: (GoogleMapController controller) {
          _controller = controller;
        });
  }

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Вы можете попытаться добавить Completer<GoogleMapController> в свой конструктор MapPage. например:

class SamplePage extends StatefulWidget {

    Completer<GoogleMapController> completer;

    SamplePage({Key key, this.completer}) : super(key: key);

    @override
    State<StatefulWidget> createState() => SamplePageState();

}

class SamplePageState extends State<SamplePage> {

    @override
    void initState() {
        super.initState();
    }

    @override
    Widget build(BuildContext context) {
        return Scaffold(
            body: GoogleMap(
                mapType: MapType.normal,
                myLocationEnabled: true,
                myLocationButtonEnabled: true,
                initialCameraPosition: _defaultCameraPosition,
                onMapCreated: (GoogleMapController controller) async {
                    widget.completer.complete(controller);
                },
            )
        );
    }

    static final CameraPosition _defaultCameraPosition = CameraPosition(
        target: LatLng(1.3139961, 103.7041659),
        zoom: 14.4746,
    );

}

А затем в ваш HomePage() добавьте новую функцию, подобную этой:

...
...

Completer<GoogleMapController> _completer = Completer();

Future<void> animateTo(double lat, double lng) async {
    final c = await _completer.future;
    final p = CameraPosition(target: LatLng(lat, lng), zoom: 14.4746);
    c.animateCamera(CameraUpdate.newCameraPosition(p));
}

...
...

Не забудьте передать переменную _completer в ваш MapPage(completer: _completer)

0 голосов
/ 29 января 2020
class MapPage extends StatefulWidget {
  final MapCreatedCallback onMapCreated;

  const MapPage({Key key, this.onMapCreated}) : super(key: key);

  @override
  _MapPageState createState() => _MapPageState();
}

class _MapPageState extends State<MapPage> {
  GoogleMapController _controller;
  CameraPosition _initialCameraLocation;

  @override
  Widget build(BuildContext context) {
    return GoogleMap(
      onMapCreated: (GoogleMapController controller) {
        _controller = controller;
        widget.onMapCreated(controller);
      },
      initialCameraPosition: _initialCameraLocation,
    );
  }
}

Домашняя страница:

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    GoogleMapController map;

    void goToLoyola() {
      //map.animateCamera(...)
    }

    return Stack(
      children: <Widget>[
        MapPage(
          onMapCreated: (controller) => map = controller,
        ),
      ],
    );
  }
}
...