Flutter地图控制插件google_maps_controller的使用

Flutter地图控制插件google_maps_controller的使用

google_maps_controller 是一个用于 Google Maps 的状态管理控制器插件,它允许你管理标记(Markers)、圆圈(Circles)、多段线(Polylines)和多边形(Polygons)。此插件受到 map_controller 插件的启发,适用于 flutter_map

开始使用

请按照 google_maps_flutter 的配置步骤进行设置。

使用方法

使用 GoogleMaps 小部件代替 GoogleMap 以使用自动设置的小部件。使用 GoogleMapsController 来执行所有操作。你可以通过提供者(provider)、继承小部件(InheritedWidget)、BLoC 或其他状态管理工具来提供控制器。

下面是一个完整的示例 DEMO:

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:google_maps_controller/google_maps_controller.dart';

void main() {
  runApp(ExampleApp());
}

class ExampleApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Google Maps Controller Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Scaffold(
        body: HomeScreen(),
      ),
    );
  }
}

class HomeScreen extends StatefulWidget {
  HomeScreen({Key? key}) : super(key: key);

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

class _HomeScreenState extends State<HomeScreen> {
  final s = "Map 2";
  late final GoogleMapsController controller;
  late final StreamSubscription<CameraPosition> subscription;
  CameraPosition? position;

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

    // 初始化地图控制器
    controller = GoogleMapsController(
      initialCameraPosition: CameraPosition(
        target: LatLng(37.42796133580664, -122.085749655962), // 初始位置
        zoom: 14.4746, // 初始缩放级别
      ),
      onTap: (latlng) {
        // 点击地图时添加一个圆圈
        Circle circle = Circle(
          circleId: CircleId("ID:" + DateTime.now().millisecondsSinceEpoch.toString()),
          center: latlng,
          fillColor: Color.fromRGBO(255, 0, 0, 1),
          strokeColor: Color.fromRGBO(155, 0, 0, 1),
          radius: 5,
          onTap: () => controller.removeCircle(circle), // 点击圆圈时移除它
          consumeTapEvents: true,
        );

        controller.addCircle(circle);
      },
    );

    // 监听相机移动事件并更新位置
    subscription = controller.onCameraMove$.listen((e) {
      setState(() {
        position = e;
      });
    });
  }

  @override
  void dispose() {
    subscription.cancel(); // 取消订阅
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Expanded(
          child: GoogleMaps(
            controller: controller, // 绑定控制器
          ),
        ),
        SafeArea(
          top: false,
          child: Text(position?.toString() ?? '移动地图'), // 显示当前相机位置
        )
      ],
    );
  }
}

在上面的代码中:

  • 我们创建了一个 GoogleMapsController 实例,并设置了初始相机位置。
  • 在点击地图时添加一个圆圈,并且点击圆圈时会移除它。
  • 监听相机移动事件,并将当前相机位置显示在屏幕上。

示例演示图

Demo

许可证

MIT 许可证。

API

完整文档可以查看 这里

GoogleMapsController
GoogleMapsController({
    void Function(GoogleMapController) onMapCreated,
    void Function() onCameraIdle,
    void Function(CameraPosition) onCameraMove,
    void Function() onCameraMoveStarted,
    void Function(LatLng) onLongPress,
    void Function(LatLng) onTap,
    CameraPosition initialCameraPosition,
    Set<Circle> initialCircles,
    Set<Marker> initialMarkers,
    Set<Polygon> initialPolygons,
    Set<Polyline> initialPolylines,
    bool buildingsEnabled,
    CameraTargetBounds cameraTargetBounds,
    bool compassEnabled,
    bool indoorViewEnabled,
    bool liteModeEnabled,
    bool zoomControlsEnabled,
    bool mapToolbarEnabled,
    MapType mapType,
    MinMaxZoomPreference minMaxZoomPreference,
    bool myLocationEnabled,
    bool myLocationButtonEnabled,
    EdgeInsets padding,
    bool rotateGesturesEnabled,
    bool scrollGesturesEnabled,
    bool tiltGesturesEnabled,
    bool trafficEnabled,
    bool zoomGesturesEnabled,
    List<Factory<OneSequenceGestureRecognizer>> gestureRecognizers,
});
GoogleMaps
GoogleMaps({
    @required GoogleMapsController controller,
})

更多关于Flutter地图控制插件google_maps_controller的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地图控制插件google_maps_controller的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用google_maps_controller插件来控制Google地图的示例代码。这个插件允许你与Google地图进行交互,比如改变地图的中心点、缩放级别、添加标记等。

首先,确保你已经在pubspec.yaml文件中添加了google_maps_flutter依赖,因为google_maps_controller实际上是google_maps_flutter提供的一个功能:

dependencies:
  flutter:
    sdk: flutter
  google_maps_flutter: ^2.1.0  # 请检查最新版本号

然后,你可以按照以下步骤在你的Flutter项目中实现地图控制:

  1. 创建Flutter项目并导入必要的包
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
  1. 定义地图控制器和状态
class MapScreen extends StatefulWidget {
  @override
  _MapScreenState createState() => _MapScreenState();
}

class _MapScreenState extends State<MapScreen> {
  late GoogleMapController _controller;
  final LatLng _initialCameraPosition = LatLng(-34.397, 150.644);
  CameraPosition _cameraPosition = CameraPosition(
    target: _initialCameraPosition,
    zoom: 11.0,
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Maps Controller Example'),
      ),
      body: GoogleMap(
        mapType: MapType.normal,
        initialCameraPosition: _cameraPosition,
        onMapCreated: (GoogleMapController controller) {
          _controller = controller;
          _updateCameraPosition();
        },
        markers: Set<Marker>.of([
          Marker(
            position: _initialCameraPosition,
            infoWindow: InfoWindow(title: 'Sydney'),
          ),
        ]),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => _moveCamera(),
        tooltip: 'Move Camera',
        child: Icon(Icons.navigate),
      ),
    );
  }

  void _updateCameraPosition() async {
    // 可以在这里更新地图的初始位置或其他设置
    // 例如,获取用户位置后更新
  }

  void _moveCamera() async {
    final LatLng newPosition = LatLng(-37.8136, 144.9631); // 墨尔本的坐标
    final CameraPosition newCameraPosition = CameraPosition(
      target: newPosition,
      zoom: 14.0,
    );
    await _controller.animateCamera(CameraUpdate.newCameraPosition(newCameraPosition));
  }
}
  1. 运行应用

确保你已经设置了Google Maps API密钥,并且已经在AndroidManifest.xmlInfo.plist中进行了相应的配置。

这个示例展示了如何使用google_maps_flutter插件的GoogleMapController来控制地图的视图。你可以通过点击浮动操作按钮来移动地图的摄像头到新的位置。

请注意,实际应用中你可能需要处理更多的地图交互,比如添加多个标记、处理地图点击事件、显示路线等。这些都可以通过google_maps_flutter插件提供的API来实现。

回到顶部