1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
| import 'dart:convert'; import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:geolocator/geolocator.dart';
class WebviewBaiduMap extends StatefulWidget { final Map<String, dynamic> data; const WebviewBaiduMap({Key? key, required this.data}) : super(key: key);
@override State<WebviewBaiduMap> createState() => _WebviewBaiduMapState(); }
class _WebviewBaiduMapState extends State<WebviewBaiduMap> { @override Widget build(BuildContext context) { InAppWebViewController? mapViewController; const String htmlUrl = 'assets/static/baidu-map-html/index.html';
Future<bool> requestLocationPermission() async { var status = await Permission.location.status; if (status == PermissionStatus.granted) { return true; } else { status = await Permission.location.request(); if (status == PermissionStatus.granted) { return true; } else { return false; } } }
void _getUserLocation() async { bool hasLocationPermission = await requestLocationPermission(); if (!hasLocationPermission) return; Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high); final newLocal = GpsUtil.gps84_To_bd09(position.latitude, position.longitude); mapViewController?.callAsyncJavaScript( functionBody: ''' var userPoint = new BMap.Point(longitude, latitude); var marker = new BMap.Marker(userPoint); map.addOverlay(marker); ''', arguments: { 'latitude': newLocal[0], 'longitude': newLocal[1], }, ); }
void _getVehicleLocation({bool? setCenter}) { final data = widget.data; List<double> newLocal = [31.2660528, 120.7407351];
mapViewController?.callAsyncJavaScript( functionBody: ''' var point = new BMap.Point(longitude, latitude); var marker = new BMap.Marker(point); map.addOverlay(marker); // 添加标记 map.panTo(point); // 地图中心点移动到指定位置 ''', arguments: { 'latitude': newLocal[0], 'longitude': newLocal[1], }, ); }
return Scaffold( resizeToAvoidBottomInset: false, body: ConstrainedBox( constraints: const BoxConstraints.expand(), child: Stack( fit: StackFit.expand, children: [ SizedBox( width: double.infinity, height: double.infinity, child: InAppWebView( initialFile: htmlUrl, initialOptions: InAppWebViewGroupOptions( crossPlatform: InAppWebViewOptions(javaScriptEnabled: true), android: AndroidInAppWebViewOptions(), ios: IOSInAppWebViewOptions(), ), onWebViewCreated: ((controller) { log('网页创建'); }), onProgressChanged: ((controller, progress) { log('load $progress'); }), onLoadStart: ((controller, url) { log('load start $url'); }), onLoadStop: ((controller, url) { log('load stop $url'); setState(() { mapViewController = controller; }); _getVehicleLocation(); _getUserLocation(); }), onLoadHttpError: ((controller, url, statusCode, description) { log('$url $description'); }), onLoadError: ((controller, url, code, message) { log('$url $message'); }), onLoadResource: ((controller, resource) { log('load resource'); }), ), ), const Positioned( top: 0, left: 0, right: 0, child: Container(), ), ], ), ), ); } }
|