Flutter地图展示与交互插件kakaomap_webview的使用

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

Flutter地图展示与交互插件kakaomap_webview的使用

安装

首先,你需要获取Kakao Map的JavaScript密钥。

更多信息,请参阅: kakao map guide : https://apis.map.kakao.com/web/guide/

  • Android
    • 最小SDK版本必须高于21。
    • AndroidManifest.xml文件中需要添加Internet权限,并在application标签中添加android:usesCleartextTraffic="true"
<application
  android:label="your app name"
  android:icon="@mipmap/ic_launcher"
  android:usesCleartextTraffic="true">
</application>
  • iOS
    • iOS版本必须高于9.0。
    • 在Info.plist中添加以下代码:
&lt;key&gt;NSAppTransportSecurity&lt;/key&gt;
      &lt;dict&gt;
        &lt;key&gt;NSAllowsArbitraryLoads&lt;/key&gt; &lt;true/&gt;
      &lt;/dict&gt;
    &lt;key&gt;io.flutter.embedded_views_preview&lt;/key&gt; &lt;true/&gt;

如何使用

首先,导入包

import 'package:kakaomap_webview/kakaomap_webview.dart';

你可以将其作为Widget和全屏WebView使用。

使用作为Widget
KakaoMapView(
  width: size.width,
  height: 400,
  kakaoMapKey: kakaoMapKey,
  lat: 33.450701,
  lng: 126.570667,
  showMapTypeControl: true,
  showZoomControl: true,
  markerImageURL: 'https://t1.daumcdn.net/localimg/localimages/07/mapapidoc/marker_red.png',
  onTapMarker: (message) {
    //事件回调当标记被点击时
  });
使用全屏WebView
KakaoMapUtil util = KakaoMapUtil();
// String url = await util.getResolvedLink(
//     util.getKakaoMapURL(37.402056, 127.108212, name: 'Kakao 본사'));

/// This is short form of the above comment
String url =
    await util.getMapScreenURL(37.402056, 127.108212, name: 'Kakao 본사');

Navigator.push(
    context, MaterialPageRoute(builder: (_) =&gt; KakaoMapScreen(url: url)));

示例代码

import 'package:flutter/material.dart';
import 'package:example/kakaomap_screen.dart';

const String kakaoMapKey = 'yourKey';

class KakaoMapTest extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Size size = MediaQuery.of(context).size;
    return Scaffold(
      appBar: AppBar(title: Text('Kakao map webview test')),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenlyy,
        children: [
          KakaoMapView(
              width: size.width,
              height: 400,
              kakaoMapKey: kakaoMapKey,
              lat: 33.450701,
              lng: 126.570667,
              showMapTypeControl: true,
              showZoomControl: true,
              markerImageURL: 'https://t1.daumcdn.net/localimg/localimages/07/mapapidoc/marker_red.png',
              onTapMarker: (message) async {
                ScaffoldMessenger.of(context)
                    .showSnackBar(SnackBar(content: Text(message.message)));
                //await _openKakaoMapScreen(context);
              }),
          ElevatedButton(
              child: Text('Kakao map screen'),
              onPressed: () async {
                await _openKakaoMapScreen(context);
              })
        ],
      ),
    );
  }

  Future&lt;void&gt; _openKakaoMapScreen(BuildContext context) async {
    KakaoMapUtil util = KakaoMapUtil();

    // String url = await util.getResolvedLink(
    //     util.getKakaoMapURL(37.402056, 127.108212, name: 'Kakao 본사'));

    /// This is short form of the above comment
    String url =
        await util.getMapScreenURL(37.402056, 127.108212, name: 'Kakao 본사');

    Navigator.push(
        context, MaterialPageRoute(builder: (_) =&gt; KakaoMapScreen(url: url)));
  }
}

注意事项

多个标记

  • 目前仅在customScript中可以制作多个标记。
  • 仍然有一个示例代码。
KakaoMapView(
    width: size.width,
    height: 400,
    kakaoMapKey: kakaoMapKey,
    lat: 33.450701,
    lng: 126.570667,
    customScript: '''
    var markers = [];

    function addMarker(position) {

      var marker = new kakao.maps.Marker({position: position});

      marker.setMap(map);

      markers.push(marker);
    }

    for(var i = 0 ; i &lt; 3 ; i++){
      addMarker(new kakao.maps.LatLng(33.450701 + 0.0003 * i, 126.570667 + 0.0003 * i));

      kakao.maps.event.addListener(markers[i], 'click', (function(i) {
        return function(){
          onTapMarker.postMessage('marker ' + i + ' is tapped');
        };
      })(i));
    }

    var zoomControl = new kakao.maps.ZoomControl();
    map.addControl(zoomControl, kakao.maps.ControlPosition.RIGHT);

    var mapTypeControl = new kakao.maps.MapTypeControl();
    map.addControl(mapTypeControl, kakao.maps.ControlPosition.TOPRIGHT);
  ''',
  onTapMarker: (message) {
    ScaffoldMessenger.of(context)
        .showSnackBar(SnackBar(content: Text(message.message)));
  });

覆盖层

  • 自从0.2.0版本开始,你可以添加文本了。
  • 简单地在KakaoMapView中添加overlayText即可。
  • 不要同时使用overlayText和customOverlay。
overlayText: '카카오!'

自定义覆盖层

  • 样图
    • 你可以根据Kakao指南自定义覆盖层。
    • 不要同时使用overlayText和customOverlay。

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用kakaomap_webview插件来展示和交互Kakao Map的示例代码。这个插件利用WebView来嵌入Kakao Map,因此它允许你在Flutter应用中集成Kakao Map的丰富功能。

首先,确保你已经在pubspec.yaml文件中添加了kakaomap_webview依赖:

dependencies:
  flutter:
    sdk: flutter
  kakaomap_webview: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,你可以在你的Flutter应用中创建一个页面来展示Kakao Map。以下是一个简单的示例:

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

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

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

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

class _MapScreenState extends State<MapScreen> {
  // Kakao Map的API Key
  final String apiKey = '你的Kakao Map API Key'; // 请替换为你的实际API Key

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Kakao Map WebView Example'),
      ),
      body: KakaoMapView(
        apiKey: apiKey,
        // 初始地图的中心坐标和缩放级别
        initialCenter: '37.566535, 126.977969', // 首尔市中心的坐标
        initialZoom: 13,
        // 地图加载完成后的回调
        onLoad: () {
          print('Map loaded');
        },
        // WebView加载错误时的回调
        onError: (error) {
          print('Map load error: $error');
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 示例:在地图上标记一个位置
          _addMarker('37.566535, 126.977969', '首尔市中心');
        },
        tooltip: 'Add Marker',
        child: Icon(Icons.add_location),
      ),
    );
  }

  // 在地图上添加标记的方法
  void _addMarker(String coordinates, String title) {
    // 使用JavaScript在WebView中执行添加标记的操作
    final js = '''
      var map = window.map;
      if (map) {
        var marker = new kakao.maps.Marker({
          position: new kakao.maps.LatLng($coordinates.split(',')[0], $coordinates.split(',')[1]),
          title: '$title'
        });
        marker.setMap(map);
      }
    ''';
    // 执行JavaScript代码
    KakaoMapView.of(context).evalJavascript(js);
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个KakaoMapView小部件用于显示Kakao Map。我们通过apiKey属性传递Kakao Map的API Key,并通过initialCenterinitialZoom属性设置地图的初始视图。

我们还添加了一个浮动操作按钮(FAB),点击按钮时会在地图上添加一个标记。这是通过执行JavaScript代码来实现的,该代码使用Kakao Map JavaScript API来创建并添加标记。

请注意,KakaoMapView.of(context).evalJavascript(js);用于在WebView中执行JavaScript代码。这种方法允许你与嵌入的Kakao Map进行交互。

在实际应用中,你需要替换你的Kakao Map API Key为你的实际API Key,并根据需要调整地图的初始设置和交互逻辑。

希望这个示例能帮助你开始在Flutter应用中使用kakaomap_webview插件!

回到顶部