Flutter地图展示插件apple_maps_flutter的使用

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

Flutter 地图展示插件 apple_maps_flutter 的使用

apple_maps_flutter 是一个用于在 Flutter 应用程序中嵌入 Apple 地图的插件。它基于 Flutter 的机制来嵌入 Android 和 iOS 视图。由于该机制目前处于开发者预览阶段,因此此插件也应被视为开发者预览。

该插件最初是基于 google_maps_flutter 插件开发的。为了简化将 google_maps_flutter 插件与 apple_maps_flutter 结合以创建跨平台实现(如 Android 和 iOS)的过程,该插件也使用了 google_maps_flutter 插件的 Flutter 实现。这还帮助创建了一个名为 flutter_platform_maps 的跨平台实现。

截图

示例 1 示例 2
示例 1 示例 2

iOS

要在 iOS 上使用此插件,你需要通过在应用的 Info.plist 文件中添加一个布尔属性来启用嵌入视图预览。属性键为 io.flutter.embedded_views_preview,值为 YES。你还需要添加 Privacy - Location When In Use Usage Description 键,并提供相应的使用描述。

Android

该插件目前没有 Android 实现。但是,有一个包结合了 apple_maps_fluttergoogle_maps_flutter 插件,以实现典型的地图实现,称为 platform_maps_flutter

示例用法

以下是一个简单的示例代码,展示了如何使用 apple_maps_flutter 插件:

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

class AppleMapsExample extends StatelessWidget {
  AppleMapController mapController;

  // 当地图创建完成时调用此方法
  void _onMapCreated(AppleMapController controller) {
    mapController = controller;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
        Expanded(
          child: Container(
            child: AppleMap(
              onMapCreated: _onMapCreated, // 地图创建完成时调用的回调
              initialCameraPosition: const CameraPosition(
                target: LatLng(0.0, 0.0), // 初始地图中心点
              ),
            ),
          ),
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            Column(
              children: <Widget>[
                FlatButton(
                  onPressed: () {
                    mapController.moveCamera(
                      CameraUpdate.newCameraPosition(
                        const CameraPosition(
                          heading: 270.0,
                          target: LatLng(51.5160895, -0.1294527),
                          pitch: 30.0,
                          zoom: 17,
                        ),
                      ),
                    );
                  },
                  child: const Text('newCameraPosition'), // 移动到新的相机位置
                ),
                FlatButton(
                  onPressed: () {
                    mapController.moveCamera(
                      CameraUpdate.newLatLngZoom(
                        const LatLng(37.4231613, -122.087159),
                        11.0,
                      ),
                    );
                  },
                  child: const Text('newLatLngZoom'), // 移动到新的经纬度并缩放
                ),
              ],
            ),
            Column(
              children: <Widget>[
                FlatButton(
                  onPressed: () {
                    mapController.moveCamera(
                      CameraUpdate.zoomIn(), // 放大
                    );
                  },
                  child: const Text('zoomIn'),
                ),
                FlatButton(
                  onPressed: () {
                    mapController.moveCamera(
                      CameraUpdate.zoomOut(), // 缩小
                    );
                  },
                  child: const Text('zoomOut'),
                ),
                FlatButton(
                  onPressed: () {
                    mapController.moveCamera(
                      CameraUpdate.zoomTo(16.0), // 缩放到特定级别
                    );
                  },
                  child: const Text('zoomTo'),
                ),
              ],
            ),
          ],
        )
      ],
    );
  }
}

完整示例代码

以下是一个完整的示例代码,展示了如何使用 apple_maps_flutter 插件创建一个包含多种功能的地图应用:

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

void main() {
  runApp(MaterialApp(home: AppleMapsExample()));
}

class AppleMapsExample extends StatelessWidget {
  AppleMapController mapController;

  void _onMapCreated(AppleMapController controller) {
    mapController = controller;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
        Expanded(
          child: Container(
            child: AppleMap(
              onMapCreated: _onMapCreated,
              initialCameraPosition: const CameraPosition(
                target: LatLng(0.0, 0.0),
              ),
            ),
          ),
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            Column(
              children: <Widget>[
                FlatButton(
                  onPressed: () {
                    mapController.moveCamera(
                      CameraUpdate.newCameraPosition(
                        const CameraPosition(
                          heading: 270.0,
                          target: LatLng(51.5160895, -0.1294527),
                          pitch: 30.0,
                          zoom: 17,
                        ),
                      ),
                    );
                  },
                  child: const Text('newCameraPosition'),
                ),
                FlatButton(
                  onPressed: () {
                    mapController.moveCamera(
                      CameraUpdate.newLatLngZoom(
                        const LatLng(37.4231613, -122.087159),
                        11.0,
                      ),
                    );
                  },
                  child: const Text('newLatLngZoom'),
                ),
              ],
            ),
            Column(
              children: <Widget>[
                FlatButton(
                  onPressed: () {
                    mapController.moveCamera(
                      CameraUpdate.zoomIn(),
                    );
                  },
                  child: const Text('zoomIn'),
                ),
                FlatButton(
                  onPressed: () {
                    mapController.moveCamera(
                      CameraUpdate.zoomOut(),
                    );
                  },
                  child: const Text('zoomOut'),
                ),
                FlatButton(
                  onPressed: () {
                    mapController.moveCamera(
                      CameraUpdate.zoomTo(16.0),
                    );
                  },
                  child: const Text('zoomTo'),
                ),
              ],
            ),
          ],
        )
      ],
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter应用中使用apple_maps_flutter插件来展示地图的代码案例。apple_maps_flutter插件是专门为iOS平台设计的,用于在Flutter应用中集成Apple Maps。

首先,确保你的Flutter环境已经配置正确,并且你有一个正在开发的Flutter项目。然后,按照以下步骤操作:

  1. 添加依赖: 在你的pubspec.yaml文件中添加apple_maps_flutter依赖:

    dependencies:
      flutter:
        sdk: flutter
      apple_maps_flutter: ^0.0.x  # 请检查最新版本号并替换x
    

    然后运行flutter pub get来安装依赖。

  2. 配置iOS项目: 由于apple_maps_flutter是iOS专用的插件,你需要在ios/Runner/Info.plist文件中添加必要的权限配置。确保你的应用有权限访问位置信息(如果需要的话):

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>应用需要访问您的位置信息以显示地图</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>应用需要始终访问您的位置信息以显示地图</string>
    
  3. 使用AppleMaps插件: 在你的Dart代码中导入apple_maps_flutter包,并使用它来展示地图。以下是一个简单的示例:

    import 'package:flutter/material.dart';
    import 'package:apple_maps_flutter/apple_maps_flutter.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Apple Maps Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MapScreen(),
        );
      }
    }
    
    class MapScreen extends StatefulWidget {
      @override
      _MapScreenState createState() => _MapScreenState();
    }
    
    class _MapScreenState extends State<MapScreen> {
      AppleMapController? _controller;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Apple Maps Demo'),
          ),
          body: AppleMap(
            initialCameraPosition: CameraPosition(
              target: LatLng(37.7853889, -122.4056973),
              zoom: 14.0,
            ),
            onMapCreated: (AppleMapController controller) {
              _controller = controller;
            },
            options: AppleMapOptions(
              myLocationEnabled: true,
              zoomGesturesEnabled: true,
              tiltGesturesEnabled: true,
              scrollGesturesEnabled: true,
              rotateGesturesEnabled: true,
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () async {
              if (_controller != null) {
                final LatLng? currentLocation = await _controller!.getMyLocation();
                if (currentLocation != null) {
                  print('Current location: ${currentLocation.latitude}, ${currentLocation.longitude}');
                }
              }
            },
            tooltip: 'Get My Location',
            child: Icon(Icons.location_on),
          ),
        );
      }
    }
    

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个使用AppleMap小部件的页面。我们设置了初始的相机位置,并启用了各种手势选项。此外,我们还添加了一个浮动操作按钮,用于获取并打印当前位置。

请注意,由于apple_maps_flutter插件是iOS专用的,因此这段代码在Android设备上运行时将不会显示地图。如果你需要在Android设备上展示地图,可以考虑使用flutter_map或其他跨平台的地图插件。

希望这个示例对你有帮助!

回到顶部