Flutter地图展示与交互插件kakaomap_webview的使用
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中添加以下代码:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key> <true/>
</dict>
<key>io.flutter.embedded_views_preview</key> <true/>
如何使用
首先,导入包
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: (_) => 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<void> _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: (_) => KakaoMapScreen(url: url)));
}
}
注意事项
- 如果你想使用KakaoMapScreen,需要处理intent和itms-app scheme URL。 请参阅示例。
- Flutter : https://github.com/devmemory/kakaomap_webview/blob/main/example/lib/kakaomap_screen.dart
- Android : https://github.com/devmemory/kakaomap_webview/tree/main/example/android/app/src/main
- 添加多边形、折线
strokeColor
,strokeWeight
,strokeColorOpacity
,polygonColor
,polygonColorOpacity
,strokeStyle
是可选的。- 这些功能有默认值。 只有路径是必需的,除非你想要自定义。
多个标记
- 目前仅在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 < 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
更多关于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,并通过initialCenter
和initialZoom
属性设置地图的初始视图。
我们还添加了一个浮动操作按钮(FAB),点击按钮时会在地图上添加一个标记。这是通过执行JavaScript代码来实现的,该代码使用Kakao Map JavaScript API来创建并添加标记。
请注意,KakaoMapView.of(context).evalJavascript(js);
用于在WebView中执行JavaScript代码。这种方法允许你与嵌入的Kakao Map进行交互。
在实际应用中,你需要替换你的Kakao Map API Key
为你的实际API Key,并根据需要调整地图的初始设置和交互逻辑。
希望这个示例能帮助你开始在Flutter应用中使用kakaomap_webview
插件!