Flutter谷歌地图辅助插件google_maps_helper的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter谷歌地图辅助插件google_maps_helper的使用

google_maps_helper 是一个扩展了 google_maps_flutter 的Flutter包,提供了包括地点自动补全文本框、绘制折线、地理编码和反向地理编码等在内的必要功能。

特性

  • 集成了所有Google地图的功能于一个包中
  • 提供了用于Google地点搜索的自动补全文本框
  • 在Google地图上绘制折线
  • 地理编码:从地址获取地理坐标
  • 反向地理编码:从地理坐标获取地址
  • 不需要单独引入 google_maps_flutter
  • 易于使用且高度可定制

google_maps_helper screenshot

开始使用

  • 查看 google_maps_flutter 的设置说明。
  • 从2.0.0版本开始,此包使用新的“Places API”进行地址搜索,请确保在你的Google Cloud项目中启用了新的“Places API”。

使用方法

Google地点自动补全文本框

Widget get _searchField {
  return GmhSearchField(
    selectedValue: _address,
    onSelected: (data) => _address = data,
    searchParams: GmhSearchParams(apiKey: '<GOOGLE_PLACES_API_NEW_KEY>'),
  );
}

使用搜索函数创建自己的自动补全功能

await GmhService().searchAddress(
  text: 'califor',
  params: GmhSearchParams(apiKey: '<GOOGLE_PLACES_API_NEW_KEY>'),
).listen((data) {
  // 在你的UI中显示这个列表
  print(data.length);
});

Google地图小部件

GoogleMapController? _controller;
final _kSrc = CameraPosition(
    target: LatLng(37.4165849896396, -122.08051867783071),
);
final _kDest = CameraPosition(
    target: LatLng(37.420921119071586, -122.08535335958004),
);

Widget get _map {
  return GmhMap(
    mapOptions: GmhMapOptions(
      mapType: MapType.normal,
      initialCameraPosition: _kSrc,
      onTap: (pos) => _getAddress(pos),
      minMaxZoomPreference: MinMaxZoomPreference(15, 18),
      onMapCreated: (controller) => _controller = controller,
      markers: {
        Marker(markerId: MarkerId('src'), position: _kSrc.target),
        Marker(markerId: MarkerId('dest'), position: _kDest.target),
      },
    ),
    polylineOptions: GmhPolylineOptions(
      geodesic: true,
      color: Colors.blue,
      optimizeWaypoints: true,
      apiKey: '<GOOGLE_DIRECTIONS_API_KEY>',
    ),
  );
}

地理编码

Future<void> _getGeocode(String address) async {
  final data = await GmhService().getGeocode(
    address: address,
    apiKey: '<GOOGLE_GEOCODING_API_KEY>',
  );
  print('${data?.lat},${data?.lng}');
}

反向地理编码

Future<void> _getAddress(LatLng pos) async {
  final data = await GmhService().getAddress(
    lat: pos.latitude,
    lng: pos.longitude,
    apiKey: '<GOOGLE_GEOCODING_API_KEY>',
  );
  print(data?.address);
}

示例代码

下面是一个完整的示例,展示了如何集成google_maps_helper到你的应用中:

// ignore_for_file: unused_field
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_helper/google_maps_helper.dart';

void main() => runApp(const MyApp());

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  GmhAddressData? _address;
  GoogleMapController? _controller;

  final _kSrc = CameraPosition(
    zoom: 18,
    target: LatLng(37.4165849896396, -122.08051867783071),
  );

  final _kDest = CameraPosition(
    zoom: 15,
    target: LatLng(37.420921119071586, -122.08535335958004),
  );

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Google Maps Helper')),
        body: SafeArea(child: Stack(children: [_map, _searchField])),
      ),
    );
  }

  /// Google map widget
  Widget get _map {
    return GmhMap(
      mapOptions: GmhMapOptions(
        mapType: MapType.normal,
        initialCameraPosition: _kSrc,
        onTap: (pos) => _getAddress(pos),
        minMaxZoomPreference: MinMaxZoomPreference(15, 18),
        onMapCreated: (controller) => _controller = controller,
        markers: {
          Marker(markerId: MarkerId('src'), position: _kSrc.target),
          Marker(markerId: MarkerId('dest'), position: _kDest.target),
        },
      ),
      polylineOptions: GmhPolylineOptions(
        geodesic: true,
        color: Colors.blue,
        optimizeWaypoints: true,
        apiKey: '<GOOGLE_DIRECTIONS_API_KEY>',
      ),
    );
  }

  /// Auto-complete places search field
  Widget get _searchField {
    return GmhSearchField(
      selectedValue: _address,
      onSelected: (data) => _address = data,
      searchParams: GmhSearchParams(apiKey: '<GOOGLE_PLACES_API_KEY>'),
    );
  }

  /// REVERSE GEOCODING: Get address from geocode
  Future<void> _getAddress(LatLng pos) async {
    final data = await GmhService().getAddress(
      lat: pos.latitude,
      lng: pos.longitude,
      apiKey: '<GOOGLE_GEOCODING_API_KEY>',
    );
    if (kDebugMode) print(data?.address);
    if (data != null) _getGeocode(data.address);
  }

  /// GEOCODING: Get geocode from an address
  Future<void> _getGeocode(String address) async {
    final data = await GmhService().getGeocode(
      address: address,
      apiKey: '<GOOGLE_GEOCODING_API_KEY>',
    );
    if (kDebugMode) print('${data?.lat},${data?.lng}');
  }
}

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

1 回复

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


当然,关于Flutter中google_maps_helper插件的使用,以下是一个简单的代码示例,展示了如何在Flutter应用中使用这个插件来集成和显示Google地图。需要注意的是,google_maps_helper并不是一个官方的Flutter插件,而是一个社区提供的库,所以它的具体API和使用方法可能会有所不同。不过,基于一般的地图插件使用方法,我们可以给出一个类似的示例。如果google_maps_helper有特定的API,你可能需要根据其文档进行调整。

在实际开始之前,请确保你已经完成了以下步骤:

  1. pubspec.yaml文件中添加google_maps_fluttergoogle_maps_helper(如果确实存在)的依赖。注意,google_maps_helper可能不是一个真实存在的插件,这里我们假设它存在,并基于一般的地图插件逻辑给出示例。如果实际不存在,你需要使用google_maps_flutter或其他类似的插件。
dependencies:
  flutter:
    sdk: flutter
  google_maps_flutter: ^x.y.z  # 替换为最新版本号
  google_maps_helper: ^a.b.c  # 假设存在,替换为最新版本号
  1. 获取Google Maps API密钥,并在android/app/src/main/AndroidManifest.xmlios/Runner/Info.plist中配置。

以下是一个基于google_maps_flutter(假设google_maps_helper提供类似功能)的示例代码:

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
// import 'package:google_maps_helper/google_maps_helper.dart'; // 如果存在的话

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Google Maps Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MapScreen(),
    );
  }
}

class MapScreen extends StatefulWidget {
  @override
  _MapScreenState createState() => _MapScreenState();
}

class _MapScreenState extends State<MapScreen> {
  GoogleMapController? _controller;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Maps'),
      ),
      body: GoogleMap(
        mapType: MapType.hybrid,
        initialCameraPosition: CameraPosition(
          target: LatLng(-34.397, 150.644),
          zoom: 11.0,
        ),
        onMapCreated: (GoogleMapController controller) {
          _controller = controller;
          // 如果google_maps_helper有特定的初始化代码,可以在这里调用
          // GoogleMapsHelper.initialize(controller); // 假设的API调用
        },
        markers: Set<Marker>.of([
          Marker(
            markerId: MarkerId('marker_id_1'),
            position: LatLng(-34.397, 150.644),
            infoWindow: InfoWindow(title: 'Sydney', snippet: 'Australia'),
          ),
        ]),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _goToTheLake,
        tooltip: 'Go to the lake',
        child: Icon(Icons.directions_boat),
      ),
    );
  }

  Future<void> _goToTheLake() async {
    final GoogleMapController? controller = _controller;
    if (controller != null) {
      final CameraPosition lake = CameraPosition(
        bearing: 191.2063446153867,
        target: LatLng(-37.8136, 144.9631),
        tilt: 59.440717697143225,
        zoom: 14.47461895815727,
      );

      controller!.animateCamera(CameraUpdate.newCameraPosition(lake));
    }
  }
}

这个示例展示了如何在Flutter应用中集成Google Maps,并设置了一个初始的地图视图、一个标记点以及一个用于改变地图视角的浮动操作按钮。如果google_maps_helper提供了额外的辅助功能(比如简化地图配置、添加自定义覆盖层等),你需要查阅其官方文档来了解如何具体使用这些功能,并相应地修改上述代码。

由于google_maps_helper可能不是一个真实存在的插件,上述代码是基于google_maps_flutter插件编写的。如果你确实找到了一个名为google_maps_helper的插件,并且它有特定的API,请参考其官方文档进行实现。

回到顶部