【问题标题】:How to animate camera from another class using Google Maps Plugin Flutter如何使用 Google Maps Plugin Flutter 为另一个类的相机设置动画
【发布时间】:2020-05-14 11:15:30
【问题描述】:

我有一个main.dart 文件,我正在其中构建一个HomePage(),其中包含一个抽屉、列表图块和一张地图。我已经在另一个 dart 文件中实现了 google maps 插件(参见下面的代码),我只是在 HomePage() 的脚手架主体中调用 MapPage()

现在,当我通过调用函数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;
        });
  }

【问题讨论】:

    标签: flutter flutter-plugin


    【解决方案1】:

    您可以尝试在 MapPage 构造函数中添加Completer&lt;GoogleMapController&gt;。例如:

    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)

    【讨论】:

      【解决方案2】:
      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,
              ),
            ],
          );
        }
      }
      

      【讨论】:

      • 谢谢,我现在怎么调用函数?
      • 主页使用 MapPage 就像您的 MapPage 使用 GoogleMap。
      • 抱歉,我在 HomePage() 的 Stack 中有 MapPage(),所以在 ListTile 的 onTap() 方法中我应该添加什么?
      猜你喜欢
      • 2020-12-25
      • 2020-12-24
      • 2019-12-06
      • 2021-10-09
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-24
      相关资源
      最近更新 更多