|
|
|
import 'dart:convert';
|
|
|
|
import 'dart:io';
|
|
|
|
import 'dart:ui';
|
|
|
|
import 'package:flutter/cupertino.dart';
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
|
|
|
|
import 'package:flutter_baidu_mapapi_map/flutter_baidu_mapapi_map.dart';
|
|
|
|
import 'package:flutter_baidu_mapapi_search/flutter_baidu_mapapi_search.dart';
|
|
|
|
import 'package:flutter_baidu_mapapi_utils/flutter_baidu_mapapi_utils.dart';
|
|
|
|
import 'package:flutter_bmflocation/flutter_bmflocation.dart';
|
|
|
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
|
|
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
|
|
|
import 'package:huixiang/utils/flutter_utils.dart';
|
|
|
|
import 'package:huixiang/utils/font_weight.dart';
|
|
|
|
import 'package:huixiang/utils/location.dart';
|
|
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
|
|
import 'package:permission_handler/permission_handler.dart';
|
|
|
|
import 'package:url_launcher/url_launcher.dart';
|
|
|
|
|
|
|
|
import '../generated/l10n.dart';
|
|
|
|
import '../retrofit/data/store_info.dart';
|
|
|
|
import '../view_widget/custom_image.dart';
|
|
|
|
import '../view_widget/location_tips.dart';
|
|
|
|
import '../view_widget/round_button.dart';
|
|
|
|
|
|
|
|
class LocationMap extends StatefulWidget {
|
|
|
|
final Map<String, dynamic> arguments;
|
|
|
|
|
|
|
|
LocationMap({this.arguments});
|
|
|
|
|
|
|
|
@override
|
|
|
|
State<StatefulWidget> createState() {
|
|
|
|
return _LocationMap();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class _LocationMap extends State<LocationMap> with WidgetsBindingObserver {
|
|
|
|
StoreInfo storeInfo;
|
|
|
|
int navigationState = 0;
|
|
|
|
double distance;
|
|
|
|
int navigationType = 0;
|
|
|
|
bool positionSorta = false;
|
|
|
|
String myAddress;
|
|
|
|
String myCity;
|
|
|
|
String hours;
|
|
|
|
String minutes;
|
|
|
|
String polylineId;
|
|
|
|
bool _isShowLocalTips = false;
|
|
|
|
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
|
|
|
WidgetsBinding.instance.addObserver(this);
|
|
|
|
storeInfo = widget.arguments["storeInfo"];
|
|
|
|
distance = widget.arguments["distance"];
|
|
|
|
getLocation();
|
|
|
|
}
|
|
|
|
|
|
|
|
void getLocation() async {
|
|
|
|
bool powerFlag = false;
|
|
|
|
try {
|
|
|
|
Future.delayed(Duration(seconds: 5), () {
|
|
|
|
Location.getInstance().stopLocation();
|
|
|
|
});
|
|
|
|
powerFlag = await Location.getInstance().startLocation(context,
|
|
|
|
(BaiduLocation result) {
|
|
|
|
if (result != null &&
|
|
|
|
result.latitude != null &&
|
|
|
|
result.longitude != null) {
|
|
|
|
print("location: $result");
|
|
|
|
myLatLng = BMFCoordinate(result.latitude, result.longitude);
|
|
|
|
myAddress = result.locationDetail;
|
|
|
|
myCity = result.city;
|
|
|
|
if (distance == null) calculate();
|
|
|
|
// AppUtils.coordConvert(myLatLng).then((value) {
|
|
|
|
// this.myLatLng = value;
|
|
|
|
locationShow();
|
|
|
|
// });
|
|
|
|
Location.getInstance().stopLocation();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} finally {
|
|
|
|
if (!powerFlag) {
|
|
|
|
if (await Permission.locationWhenInUse.status.isGranted) {
|
|
|
|
getLocation();
|
|
|
|
} else {
|
|
|
|
_isShowLocalTips = true;
|
|
|
|
}
|
|
|
|
// else {
|
|
|
|
// SmartDialog.showToast("您定位服务未开启,请前往系统设置中开启定位服务",
|
|
|
|
// alignment: Alignment.center);
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
setState(() {});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
calculate() async {
|
|
|
|
BMFCoordinate bmfCoordinate = BMFCoordinate(
|
|
|
|
double.tryParse(storeInfo.latitude),
|
|
|
|
double.tryParse(storeInfo.longitude),
|
|
|
|
);
|
|
|
|
distance = double.tryParse(
|
|
|
|
await AppUtils.calculateDistance(bmfCoordinate, myLatLng, isMi: true));
|
|
|
|
}
|
|
|
|
|
|
|
|
locationShow() {
|
|
|
|
BMFLocation location = BMFLocation(
|
|
|
|
coordinate: myLatLng,
|
|
|
|
altitude: 0,
|
|
|
|
horizontalAccuracy: 5,
|
|
|
|
verticalAccuracy: -1.0,
|
|
|
|
speed: -1.0,
|
|
|
|
course: -1.0,
|
|
|
|
);
|
|
|
|
BMFUserLocation userLocation = BMFUserLocation(
|
|
|
|
location: location,
|
|
|
|
);
|
|
|
|
setState(() {
|
|
|
|
_mapController.updateLocationData(userLocation);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void dispose() {
|
|
|
|
WidgetsBinding.instance.removeObserver(this);
|
|
|
|
Location.getInstance().stopLocation();
|
|
|
|
super.dispose();
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void didChangeAppLifecycleState(AppLifecycleState state) {
|
|
|
|
if (state == AppLifecycleState.resumed) {
|
|
|
|
// 处理应用程序切换回前台的逻辑
|
|
|
|
permissionSettings();
|
|
|
|
} else if (state == AppLifecycleState.paused) {
|
|
|
|
// 处理应用程序切换到后台的逻辑
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void permissionSettings() async {
|
|
|
|
if (_isShowLocalTips && await Permission.location.isGranted) {
|
|
|
|
_isShowLocalTips = false;
|
|
|
|
getLocation();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return Scaffold(
|
|
|
|
// appBar: MyAppBar(
|
|
|
|
// background: Color(0xFFF7F7F7),
|
|
|
|
// title: widget.arguments["storeName"],
|
|
|
|
// titleColor: Colors.black87,
|
|
|
|
// titleSize: 18.sp,
|
|
|
|
// leadingColor: Colors.black,
|
|
|
|
// ),
|
|
|
|
body: Stack(
|
|
|
|
children: [
|
|
|
|
Stack(
|
|
|
|
children: [
|
|
|
|
Column(
|
|
|
|
children: [
|
|
|
|
Expanded(
|
|
|
|
child: Container(
|
|
|
|
//BMFMapWidget 组件会自动默认沾满全屏,并且挡住所有遮盖物 ,BMFTextureMapWidget不会强制遮盖其他控件。
|
|
|
|
child: (Platform.isAndroid)
|
|
|
|
? BMFTextureMapWidget(
|
|
|
|
mapOptions: BMFMapOptions(
|
|
|
|
center: BMFCoordinate(
|
|
|
|
double.tryParse(widget.arguments["lat"]),
|
|
|
|
double.tryParse(widget.arguments["lng"]),
|
|
|
|
),
|
|
|
|
showZoomControl: false,
|
|
|
|
showMapScaleBar: false,
|
|
|
|
rotateEnabled: false,
|
|
|
|
zoomLevel: 15,
|
|
|
|
),
|
|
|
|
onBMFMapCreated: onMapCreated,
|
|
|
|
)
|
|
|
|
: BMFMapWidget(
|
|
|
|
mapOptions: BMFMapOptions(
|
|
|
|
center: BMFCoordinate(
|
|
|
|
double.tryParse(widget.arguments["lat"]),
|
|
|
|
double.tryParse(widget.arguments["lng"]),
|
|
|
|
),
|
|
|
|
showZoomControl: false,
|
|
|
|
showMapScaleBar: false,
|
|
|
|
rotateEnabled: false,
|
|
|
|
zoomLevel: 15,
|
|
|
|
),
|
|
|
|
onBMFMapCreated: onMapCreated,
|
|
|
|
)),
|
|
|
|
flex: 3,
|
|
|
|
),
|
|
|
|
navigationState == 0
|
|
|
|
? Container(
|
|
|
|
height: 253.h,
|
|
|
|
padding: EdgeInsets.only(
|
|
|
|
top: 16.h, left: 16.w, right: 28.w),
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: Colors.white,
|
|
|
|
boxShadow: [
|
|
|
|
BoxShadow(
|
|
|
|
color: Color(0x08213303),
|
|
|
|
offset: Offset(0, 2),
|
|
|
|
blurRadius: 4,
|
|
|
|
spreadRadius: 0,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
borderRadius: BorderRadius.vertical(
|
|
|
|
top: Radius.circular(8),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
child: Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
Expanded(
|
|
|
|
child: Row(
|
|
|
|
children: [
|
|
|
|
Expanded(
|
|
|
|
child: Column(
|
|
|
|
children: [
|
|
|
|
Text(
|
|
|
|
storeInfo?.storeName ?? "",
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 20.sp,
|
|
|
|
color: Color(0xFF0D0D0D),
|
|
|
|
fontWeight: MyFontWeight.medium,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Row(
|
|
|
|
children: [
|
|
|
|
Text(
|
|
|
|
S.of(context).ren(
|
|
|
|
storeInfo != null
|
|
|
|
? storeInfo
|
|
|
|
.perCapitaConsumption
|
|
|
|
: "",
|
|
|
|
),
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 12.sp,
|
|
|
|
fontWeight:
|
|
|
|
MyFontWeight.regular,
|
|
|
|
color: Color(0xFF4D4D4D),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
SizedBox(
|
|
|
|
width: 20.w,
|
|
|
|
),
|
|
|
|
]..addAll(itemServer(
|
|
|
|
storeInfo != null
|
|
|
|
? storeInfo.businessService
|
|
|
|
: "")),
|
|
|
|
),
|
|
|
|
Text(
|
|
|
|
S.of(context).yingyeshijian(storeInfo ==
|
|
|
|
null
|
|
|
|
? ""
|
|
|
|
: (storeInfo.openStartTime ==
|
|
|
|
null &&
|
|
|
|
storeInfo.openEndTime ==
|
|
|
|
null)
|
|
|
|
? S.of(context).quantian
|
|
|
|
: "${storeInfo.openStartTime.substring(0, storeInfo.openStartTime.lastIndexOf(":"))} "
|
|
|
|
"- ${storeInfo.openEndTime.substring(0, storeInfo.openEndTime.lastIndexOf(":"))}"),
|
|
|
|
style: TextStyle(
|
|
|
|
color: Color(0xFF4D4D4D),
|
|
|
|
fontWeight: MyFontWeight.medium,
|
|
|
|
fontSize: 12.sp,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
mainAxisAlignment:
|
|
|
|
MainAxisAlignment.spaceAround,
|
|
|
|
crossAxisAlignment:
|
|
|
|
CrossAxisAlignment.start,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
MImage(
|
|
|
|
storeInfo != null ? storeInfo.logo : "",
|
|
|
|
width: 72.h,
|
|
|
|
height: 72.h,
|
|
|
|
fit: BoxFit.cover,
|
|
|
|
errorSrc: "assets/image/default_1.webp",
|
|
|
|
fadeSrc: "assets/image/default_1.webp",
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.only(bottom: 32.h),
|
|
|
|
child: Text(
|
|
|
|
"${storeInfo != null ? storeInfo.address : ""}",
|
|
|
|
maxLines: 2,
|
|
|
|
textAlign: TextAlign.justify,
|
|
|
|
style: TextStyle(
|
|
|
|
color: Color(0xFF353535),
|
|
|
|
fontWeight: MyFontWeight.regular,
|
|
|
|
fontSize: 12.sp,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
GestureDetector(
|
|
|
|
behavior: HitTestBehavior.opaque,
|
|
|
|
onTap: () {
|
|
|
|
if (myLatLng == null) {
|
|
|
|
// onOpenBaiduMap();
|
|
|
|
SmartDialog.showToast(
|
|
|
|
"您定位服务未开启,请前往系统设置中开启定位服务",
|
|
|
|
alignment: Alignment.center);
|
|
|
|
} else {
|
|
|
|
navigationState = 1;
|
|
|
|
if ((distance ?? 0) < 500)
|
|
|
|
navigationType = 1;
|
|
|
|
else if ((distance ?? 0) < 1500)
|
|
|
|
navigationType = 2;
|
|
|
|
else
|
|
|
|
navigationType = 4;
|
|
|
|
navigationPosition();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
child: Container(
|
|
|
|
alignment: Alignment.center,
|
|
|
|
width: double.infinity,
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 10.h),
|
|
|
|
margin: EdgeInsets.only(bottom: 30.h),
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: Color(0xFF32A060),
|
|
|
|
borderRadius: BorderRadius.circular(23),
|
|
|
|
),
|
|
|
|
child: Text(
|
|
|
|
"到这去",
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 20.sp,
|
|
|
|
color: Colors.white,
|
|
|
|
fontWeight: MyFontWeight.medium,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
),
|
|
|
|
)
|
|
|
|
: navigationDistance(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
navigationState == 0
|
|
|
|
? GestureDetector(
|
|
|
|
behavior: HitTestBehavior.opaque,
|
|
|
|
onTap: () {
|
|
|
|
Navigator.of(context).pop();
|
|
|
|
},
|
|
|
|
child: Container(
|
|
|
|
height: 56.h,
|
|
|
|
margin: EdgeInsets.only(
|
|
|
|
top: MediaQuery.of(context).padding.top + 16.h,
|
|
|
|
left: 14.w,
|
|
|
|
right: 14.w),
|
|
|
|
padding: EdgeInsets.only(left: 12.w, right: 21.w),
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: Colors.white,
|
|
|
|
boxShadow: [
|
|
|
|
BoxShadow(
|
|
|
|
color: Color(0x08213303),
|
|
|
|
offset: Offset(0, 2),
|
|
|
|
blurRadius: 4,
|
|
|
|
spreadRadius: 0,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
borderRadius: BorderRadius.circular(6),
|
|
|
|
),
|
|
|
|
child: Row(
|
|
|
|
children: [
|
|
|
|
Icon(
|
|
|
|
Icons.arrow_back_ios,
|
|
|
|
color: Color(0xFF353535),
|
|
|
|
size: 24,
|
|
|
|
),
|
|
|
|
Expanded(
|
|
|
|
child: Text(
|
|
|
|
storeInfo?.storeName ?? "",
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
style: TextStyle(
|
|
|
|
color: Color(0xFF0D0D0D),
|
|
|
|
fontSize: 18.sp,
|
|
|
|
fontWeight: MyFontWeight.regular,
|
|
|
|
),
|
|
|
|
))
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
: navigationBox(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
if (_isShowLocalTips)
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
|
|
|
|
child: LocationTips(() {
|
|
|
|
setState(() {
|
|
|
|
_isShowLocalTips = false;
|
|
|
|
});
|
|
|
|
}),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
void onOpenBaiduMap() async {
|
|
|
|
launch(
|
|
|
|
"baidumap://map/marker?location=${storeInfo.latitude},${storeInfo.longitude}&title=${storeInfo.storeName}&content=${storeInfo.storeName}&traffic=on&src=andr.baidu.openAPIdemo&coord_type=gcj02");
|
|
|
|
}
|
|
|
|
|
|
|
|
//調取百度地圖APP
|
|
|
|
void onOpenBaiduMapRoute() async {
|
|
|
|
// 我的位置
|
|
|
|
BMFCoordinate startCoord = BMFCoordinate(
|
|
|
|
positionSorta == false
|
|
|
|
? myLatLng.latitude
|
|
|
|
: latLng.latitude,
|
|
|
|
positionSorta == false
|
|
|
|
? myLatLng.longitude
|
|
|
|
: latLng.longitude);
|
|
|
|
String startName = ((positionSorta == false) ? "我的位置" : "终点");
|
|
|
|
// 去的位置
|
|
|
|
String endName = ((positionSorta == false) ? "终点" : "我的位置");
|
|
|
|
BMFCoordinate endCoord = BMFCoordinate(
|
|
|
|
positionSorta == false
|
|
|
|
? latLng.latitude
|
|
|
|
: myLatLng.latitude,
|
|
|
|
positionSorta == false
|
|
|
|
? latLng.longitude
|
|
|
|
: myLatLng.longitude);
|
|
|
|
BMFOpenRouteOption routeOption = BMFOpenRouteOption(
|
|
|
|
startCoord: startCoord,
|
|
|
|
startName: startName,
|
|
|
|
endCoord: endCoord,
|
|
|
|
endName: endName,
|
|
|
|
routeType: navigationType == 1
|
|
|
|
? BMFOpenRouteType.WalkingRoute
|
|
|
|
: navigationType == 2
|
|
|
|
? BMFOpenRouteType.WalkingRoute
|
|
|
|
: navigationType == 3
|
|
|
|
? BMFOpenRouteType.TransitRoute
|
|
|
|
: BMFOpenRouteType.DrivingRoute,
|
|
|
|
appScheme: 'baidumapsdk_flutter://mapsdk.baidu.com',
|
|
|
|
// 指定返回自定义scheme
|
|
|
|
isSupportWeb: true);
|
|
|
|
BMFOpenErrorCode flag =
|
|
|
|
await BMFOpenMapUtils.openBaiduMapRoute(routeOption);
|
|
|
|
print('open - route - errorCode = $flag');
|
|
|
|
}
|
|
|
|
|
|
|
|
updateMapLine(List<BMFCoordinate> coordinates, int needHours, int needMinutes,
|
|
|
|
double needDistance) {
|
|
|
|
try {
|
|
|
|
//刪除之前的創建的點和綫
|
|
|
|
_mapController.cleanAllMarkers();
|
|
|
|
if (polylineId != null) _mapController.removeOverlay(polylineId);
|
|
|
|
|
|
|
|
/// 创建polyline
|
|
|
|
BMFPolyline colorsPolyline = BMFPolyline(
|
|
|
|
// id: polylineOptions.hashCode.toString(),
|
|
|
|
coordinates: coordinates,
|
|
|
|
indexs: [0],
|
|
|
|
textures: [
|
|
|
|
navigationType != 4
|
|
|
|
? 'assets/image/traffic_texture_unknown.png'
|
|
|
|
: 'assets/image/traffic_texture_smooth.png'
|
|
|
|
],
|
|
|
|
width: Platform.isAndroid ? 16 : 10,
|
|
|
|
lineDashType: BMFLineDashType.LineDashTypeNone,
|
|
|
|
lineCapType: BMFLineCapType.LineCapButt,
|
|
|
|
lineJoinType: BMFLineJoinType.LineJoinRound);
|
|
|
|
polylineId = colorsPolyline.id;
|
|
|
|
|
|
|
|
/// 添加polyline
|
|
|
|
_mapController.addPolyline(colorsPolyline);
|
|
|
|
var startBmfMarker = BMFMarker.icon(
|
|
|
|
position: BMFCoordinate(
|
|
|
|
coordinates.first.latitude, coordinates.first.longitude),
|
|
|
|
centerOffset: BMFPoint(0.5, 0.7),
|
|
|
|
enabled: false,
|
|
|
|
icon: "assets/image/icon_start.png",
|
|
|
|
draggable: false,
|
|
|
|
);
|
|
|
|
_mapController.addMarker(startBmfMarker);
|
|
|
|
|
|
|
|
var terminalBmfMarker = BMFMarker.icon(
|
|
|
|
position: BMFCoordinate(
|
|
|
|
coordinates.last.latitude, coordinates.last.longitude),
|
|
|
|
centerOffset: BMFPoint(0.5, 0.7),
|
|
|
|
enabled: false,
|
|
|
|
icon: "assets/image/icon_end.png",
|
|
|
|
draggable: false,
|
|
|
|
);
|
|
|
|
_mapController.addMarker(terminalBmfMarker);
|
|
|
|
|
|
|
|
double maxLatitude = 0,
|
|
|
|
minLatitude = 0,
|
|
|
|
maxLongitude = 0,
|
|
|
|
minLongitude = 0;
|
|
|
|
coordinates.forEach((element) {
|
|
|
|
if (element.latitude > maxLatitude) maxLatitude = element.latitude;
|
|
|
|
if (minLatitude == 0)
|
|
|
|
minLatitude = element.latitude;
|
|
|
|
else if (element.latitude < minLatitude) minLatitude = element.latitude;
|
|
|
|
|
|
|
|
if (element.longitude > maxLongitude) maxLongitude = element.longitude;
|
|
|
|
if (minLongitude == 0)
|
|
|
|
minLongitude = element.longitude;
|
|
|
|
else if (element.longitude < minLongitude)
|
|
|
|
minLongitude = element.longitude;
|
|
|
|
});
|
|
|
|
_mapController.setVisibleMapBounds(
|
|
|
|
BMFCoordinateBounds(
|
|
|
|
northeast: BMFCoordinate(
|
|
|
|
maxLatitude + ((maxLatitude - minLatitude) * 0.8),
|
|
|
|
maxLongitude + ((maxLongitude - minLongitude) / 2)),
|
|
|
|
southwest: BMFCoordinate(
|
|
|
|
minLatitude - ((maxLatitude - minLatitude) * 0.2),
|
|
|
|
minLongitude - ((maxLongitude - minLongitude) / 2))),
|
|
|
|
true);
|
|
|
|
|
|
|
|
hours = needHours == 0 ? "" : "$needHours小时";
|
|
|
|
minutes = needMinutes == 0 ? "" : "$needMinutes分钟";
|
|
|
|
distance = needDistance;
|
|
|
|
} finally {
|
|
|
|
setState(() {});
|
|
|
|
EasyLoading.dismiss();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
navigationPosition() async {
|
|
|
|
EasyLoading.show(
|
|
|
|
status: S.current.zhengzaijiazai, maskType: EasyLoadingMaskType.black);
|
|
|
|
BMFPlanNode from = BMFPlanNode(
|
|
|
|
cityName: positionSorta == false ? myCity : (storeInfo?.city ?? ""),
|
|
|
|
name: positionSorta == false ? myAddress : storeInfo?.address ?? "",
|
|
|
|
pt: positionSorta == false
|
|
|
|
? BMFCoordinate(myLatLng?.latitude ?? 0, myLatLng?.longitude ?? 0)
|
|
|
|
: latLng);
|
|
|
|
BMFPlanNode to = BMFPlanNode(
|
|
|
|
// cityName: positionSorta == false ? (storeInfo?.city ?? "") : myCity,
|
|
|
|
// name: positionSorta == false ? (storeInfo?.address ?? "") : myAddress,
|
|
|
|
pt: positionSorta == false
|
|
|
|
? latLng
|
|
|
|
: BMFCoordinate(myLatLng?.latitude ?? 0, myLatLng?.longitude ?? 0));
|
|
|
|
if (navigationType == 1) {
|
|
|
|
//步行
|
|
|
|
BMFWalkingRoutePlanOption walkingRoutePlanOption =
|
|
|
|
BMFWalkingRoutePlanOption(from: from, to: to);
|
|
|
|
// 检索实例
|
|
|
|
BMFWalkingRouteSearch walkingRouteSearch = BMFWalkingRouteSearch();
|
|
|
|
// 检索回调
|
|
|
|
walkingRouteSearch.onGetWalkingRouteSearchResult(callback:
|
|
|
|
(BMFWalkingRouteResult result, BMFSearchErrorCode errorCode) async {
|
|
|
|
if (errorCode == BMFSearchErrorCode.RESULT_NOT_FOUND) {
|
|
|
|
SmartDialog.showToast("该方案暂无可用的规划路线", alignment: Alignment.center);
|
|
|
|
EasyLoading.dismiss();
|
|
|
|
return;
|
|
|
|
} else if (errorCode != BMFSearchErrorCode.NO_ERROR) {
|
|
|
|
SmartDialog.showToast("获取路线规划失败,请稍后再试", alignment: Alignment.center);
|
|
|
|
EasyLoading.dismiss();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
print(
|
|
|
|
'`步行检索回调 errorCode = ${errorCode} \n result = ${result?.toMap()}');
|
|
|
|
|
|
|
|
/// 坐标点
|
|
|
|
List<BMFCoordinate> coordinates = [];
|
|
|
|
result.routes.first.steps.forEach((e1) {
|
|
|
|
e1.points.forEach((e2) {
|
|
|
|
coordinates.add(BMFCoordinate(e2.latitude, e2.longitude));
|
|
|
|
});
|
|
|
|
});
|
|
|
|
updateMapLine(
|
|
|
|
coordinates,
|
|
|
|
result.routes.first.duration.hours,
|
|
|
|
result.routes.first.duration.minutes,
|
|
|
|
result.routes.first.distance.toDouble());
|
|
|
|
});
|
|
|
|
bool flag =
|
|
|
|
await walkingRouteSearch.walkingRouteSearch(walkingRoutePlanOption);
|
|
|
|
} else if (navigationType == 2) {
|
|
|
|
//骑行
|
|
|
|
BMFRidingRoutePlanOption ridingRoutePlanOption =
|
|
|
|
BMFRidingRoutePlanOption(from: from, to: to);
|
|
|
|
BMFRidingRouteSearch ridingRouteSearch = BMFRidingRouteSearch();
|
|
|
|
ridingRouteSearch.onGetRidingRouteSearchResult(callback:
|
|
|
|
(BMFRidingRouteResult result, BMFSearchErrorCode errorCode) {
|
|
|
|
if (errorCode == BMFSearchErrorCode.RESULT_NOT_FOUND) {
|
|
|
|
SmartDialog.showToast("该方案暂无可用的规划路线", alignment: Alignment.center);
|
|
|
|
EasyLoading.dismiss();
|
|
|
|
return;
|
|
|
|
} else if (errorCode != BMFSearchErrorCode.NO_ERROR) {
|
|
|
|
SmartDialog.showToast("获取路线规划失败,请稍后再试", alignment: Alignment.center);
|
|
|
|
EasyLoading.dismiss();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
print(
|
|
|
|
'`骑行检索回调 errorCode = ${errorCode} \n result = ${result?.toMap()}');
|
|
|
|
|
|
|
|
/// 坐标点
|
|
|
|
List<BMFCoordinate> coordinates = [];
|
|
|
|
result.routes.first.steps.forEach((e1) {
|
|
|
|
e1.points.forEach((e2) {
|
|
|
|
coordinates.add(BMFCoordinate(e2.latitude, e2.longitude));
|
|
|
|
});
|
|
|
|
});
|
|
|
|
updateMapLine(
|
|
|
|
coordinates,
|
|
|
|
result.routes.first.duration.hours,
|
|
|
|
result.routes.first.duration.minutes,
|
|
|
|
result.routes.first.distance.toDouble());
|
|
|
|
});
|
|
|
|
// 发起检索
|
|
|
|
bool flag =
|
|
|
|
await ridingRouteSearch.ridingRouteSearch(ridingRoutePlanOption);
|
|
|
|
} else if (navigationType == 3) {
|
|
|
|
//公交
|
|
|
|
BMFTransitRoutePlanOption transitRoutePlanOption =
|
|
|
|
BMFTransitRoutePlanOption(from: from, to: to, city: '武汉市');
|
|
|
|
BMFTransitRouteSearch transitRouteSearch = BMFTransitRouteSearch();
|
|
|
|
transitRouteSearch.onGetTransitRouteSearchResult(callback:
|
|
|
|
(BMFTransitRouteResult result, BMFSearchErrorCode errorCode) {
|
|
|
|
if (errorCode == BMFSearchErrorCode.RESULT_NOT_FOUND) {
|
|
|
|
SmartDialog.showToast("该方案暂无可用的规划路线", alignment: Alignment.center);
|
|
|
|
EasyLoading.dismiss();
|
|
|
|
return;
|
|
|
|
} else if (errorCode != BMFSearchErrorCode.NO_ERROR) {
|
|
|
|
SmartDialog.showToast("获取路线规划失败,请稍后再试", alignment: Alignment.center);
|
|
|
|
EasyLoading.dismiss();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
print(
|
|
|
|
'`市内公交检索回调 errorCode = ${errorCode} \n result = ${result?.toMap()}');
|
|
|
|
|
|
|
|
/// 坐标点
|
|
|
|
List<BMFCoordinate> coordinates = [];
|
|
|
|
result.routes.first.steps.forEach((e1) {
|
|
|
|
e1.points.forEach((e2) {
|
|
|
|
coordinates.add(BMFCoordinate(e2.latitude, e2.longitude));
|
|
|
|
});
|
|
|
|
});
|
|
|
|
updateMapLine(
|
|
|
|
coordinates,
|
|
|
|
result.routes.first.duration.hours,
|
|
|
|
result.routes.first.duration.minutes,
|
|
|
|
result.routes.first.distance.toDouble());
|
|
|
|
});
|
|
|
|
// 发起检索
|
|
|
|
bool flag =
|
|
|
|
await transitRouteSearch.transitRouteSearch(transitRoutePlanOption);
|
|
|
|
} else {
|
|
|
|
//驾车
|
|
|
|
BMFDrivingRoutePlanOption drivingRoutePlanOption =
|
|
|
|
BMFDrivingRoutePlanOption(from: from, to: to);
|
|
|
|
BMFDrivingRouteSearch drivingRouteSearch = BMFDrivingRouteSearch();
|
|
|
|
drivingRouteSearch.onGetDrivingRouteSearchResult(callback:
|
|
|
|
(BMFDrivingRouteResult result, BMFSearchErrorCode errorCode) {
|
|
|
|
if (errorCode == BMFSearchErrorCode.RESULT_NOT_FOUND) {
|
|
|
|
SmartDialog.showToast("该方案暂无可用的规划路线", alignment: Alignment.center);
|
|
|
|
EasyLoading.dismiss();
|
|
|
|
return;
|
|
|
|
} else if (errorCode != BMFSearchErrorCode.NO_ERROR) {
|
|
|
|
SmartDialog.showToast("获取路线规划失败,请稍后再试", alignment: Alignment.center);
|
|
|
|
EasyLoading.dismiss();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
print(
|
|
|
|
'驾车检索回调 errorCode = ${errorCode} \n result = ${result?.toMap()}');
|
|
|
|
|
|
|
|
/// 坐标点
|
|
|
|
List<BMFCoordinate> coordinates = [];
|
|
|
|
result.routes.first.steps.forEach((e1) {
|
|
|
|
e1.points.forEach((e2) {
|
|
|
|
coordinates.add(BMFCoordinate(e2.latitude, e2.longitude));
|
|
|
|
});
|
|
|
|
});
|
|
|
|
updateMapLine(
|
|
|
|
coordinates,
|
|
|
|
result.routes.first.duration.hours,
|
|
|
|
result.routes.first.duration.minutes,
|
|
|
|
result.routes.first.distance.toDouble());
|
|
|
|
});
|
|
|
|
// 发起检索
|
|
|
|
bool flag =
|
|
|
|
await drivingRouteSearch.dringRouteSearch(drivingRoutePlanOption);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Widget navigationBox() {
|
|
|
|
return Container(
|
|
|
|
height: 132.h,
|
|
|
|
margin: EdgeInsets.only(
|
|
|
|
top: MediaQuery.of(context).padding.top + 16.h,
|
|
|
|
left: 14.w,
|
|
|
|
right: 14.w),
|
|
|
|
padding: EdgeInsets.only(left: 12.w, right: 18.w, top: 8.h),
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: Colors.white,
|
|
|
|
boxShadow: [
|
|
|
|
BoxShadow(
|
|
|
|
color: Color(0x08213303),
|
|
|
|
offset: Offset(0, 2),
|
|
|
|
blurRadius: 4,
|
|
|
|
spreadRadius: 0,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
borderRadius: BorderRadius.circular(6),
|
|
|
|
),
|
|
|
|
child: Row(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
GestureDetector(
|
|
|
|
behavior: HitTestBehavior.opaque,
|
|
|
|
onTap: () {
|
|
|
|
setState(() {
|
|
|
|
navigationState = 0;
|
|
|
|
});
|
|
|
|
},
|
|
|
|
child: Padding(
|
|
|
|
padding: EdgeInsets.only(top: 10.h, right: 10.w),
|
|
|
|
child: Icon(
|
|
|
|
Icons.arrow_back_ios,
|
|
|
|
color: Color(0xFF353535),
|
|
|
|
size: 24,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Expanded(
|
|
|
|
child: Column(
|
|
|
|
children: [
|
|
|
|
Container(
|
|
|
|
width: double.infinity,
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: Color(0xFFF5F5F5),
|
|
|
|
borderRadius: BorderRadius.circular(6),
|
|
|
|
),
|
|
|
|
padding: EdgeInsets.only(
|
|
|
|
top: 12.h,
|
|
|
|
bottom: 12.h,
|
|
|
|
left: 15.w,
|
|
|
|
),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
children: [
|
|
|
|
Expanded(
|
|
|
|
child: Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.only(
|
|
|
|
bottom: 14.h,
|
|
|
|
),
|
|
|
|
child: Row(
|
|
|
|
children: [
|
|
|
|
Container(
|
|
|
|
width: 4.h,
|
|
|
|
height: 4.h,
|
|
|
|
margin: EdgeInsets.only(right: 20.w),
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: Color(0xFF32A060),
|
|
|
|
borderRadius: BorderRadius.circular(6),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Expanded(
|
|
|
|
child: Text(
|
|
|
|
positionSorta == false
|
|
|
|
? "我的位置"
|
|
|
|
: (storeInfo?.storeName ?? ""),
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
style: TextStyle(
|
|
|
|
color: Color(0xFF0D0D0D),
|
|
|
|
fontSize: 14.sp,
|
|
|
|
fontWeight: MyFontWeight.semi_bold,
|
|
|
|
),
|
|
|
|
))
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Row(
|
|
|
|
children: [
|
|
|
|
Container(
|
|
|
|
width: 4.h,
|
|
|
|
height: 4.h,
|
|
|
|
margin: EdgeInsets.only(right: 20.w),
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: Color(0xFFFA5151),
|
|
|
|
borderRadius: BorderRadius.circular(6),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Expanded(
|
|
|
|
child: Text(
|
|
|
|
positionSorta == false
|
|
|
|
? (storeInfo?.storeName ?? "")
|
|
|
|
: "我的位置",
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
style: TextStyle(
|
|
|
|
color: Color(0xFF0D0D0D),
|
|
|
|
fontSize: 14.sp,
|
|
|
|
fontWeight: MyFontWeight.semi_bold,
|
|
|
|
),
|
|
|
|
))
|
|
|
|
],
|
|
|
|
)
|
|
|
|
],
|
|
|
|
)),
|
|
|
|
GestureDetector(
|
|
|
|
behavior: HitTestBehavior.opaque,
|
|
|
|
onTap: () {
|
|
|
|
positionSorta = !positionSorta;
|
|
|
|
navigationPosition();
|
|
|
|
},
|
|
|
|
child: Container(
|
|
|
|
padding: EdgeInsets.only(right: 24.w),
|
|
|
|
child: Image.asset(
|
|
|
|
"assets/image/position_sort.webp",
|
|
|
|
fit: BoxFit.fill,
|
|
|
|
height: 16.h,
|
|
|
|
width: 14.w,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
SizedBox(
|
|
|
|
height: 12.h,
|
|
|
|
),
|
|
|
|
Row(
|
|
|
|
children: [
|
|
|
|
Expanded(
|
|
|
|
child: GestureDetector(
|
|
|
|
behavior: HitTestBehavior.opaque,
|
|
|
|
onTap: () {
|
|
|
|
navigationType = 4;
|
|
|
|
navigationPosition();
|
|
|
|
},
|
|
|
|
child: Container(
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: navigationType == 4
|
|
|
|
? Color(0xFFE8FFF2)
|
|
|
|
: Colors.transparent,
|
|
|
|
borderRadius: BorderRadius.circular(23),
|
|
|
|
),
|
|
|
|
padding:
|
|
|
|
EdgeInsets.symmetric(vertical: 5.h, horizontal: 13.w),
|
|
|
|
child: Row(
|
|
|
|
children: [
|
|
|
|
if (navigationType == 4)
|
|
|
|
Image.asset(
|
|
|
|
"assets/image/icon_drive.webp",
|
|
|
|
fit: BoxFit.fill,
|
|
|
|
height: 16.h,
|
|
|
|
width: 14.w,
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.only(left: 2.w),
|
|
|
|
child: Text(
|
|
|
|
"驾车",
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
style: TextStyle(
|
|
|
|
color: navigationType == 4
|
|
|
|
? Color(0xFF32A060)
|
|
|
|
: Colors.black,
|
|
|
|
fontSize: 12.sp,
|
|
|
|
fontWeight: MyFontWeight.medium,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)),
|
|
|
|
Expanded(
|
|
|
|
child: GestureDetector(
|
|
|
|
behavior: HitTestBehavior.opaque,
|
|
|
|
onTap: () {
|
|
|
|
navigationType = 3;
|
|
|
|
navigationPosition();
|
|
|
|
},
|
|
|
|
child: Container(
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: navigationType == 3
|
|
|
|
? Color(0xFFE8FFF2)
|
|
|
|
: Colors.transparent,
|
|
|
|
borderRadius: BorderRadius.circular(23),
|
|
|
|
),
|
|
|
|
padding: EdgeInsets.symmetric(
|
|
|
|
vertical: 5.h, horizontal: 13.w),
|
|
|
|
child: Row(
|
|
|
|
children: [
|
|
|
|
if (navigationType == 3)
|
|
|
|
Image.asset(
|
|
|
|
"assets/image/icon_transit.webp",
|
|
|
|
fit: BoxFit.fill,
|
|
|
|
height: 16.h,
|
|
|
|
width: 14.w,
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.only(left: 2.w),
|
|
|
|
child: Text(
|
|
|
|
"公交",
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
style: TextStyle(
|
|
|
|
color: navigationType == 3
|
|
|
|
? Color(0xFF32A060)
|
|
|
|
: Colors.black,
|
|
|
|
fontSize: 12.sp,
|
|
|
|
fontWeight: MyFontWeight.medium,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
),
|
|
|
|
))),
|
|
|
|
Expanded(
|
|
|
|
child: GestureDetector(
|
|
|
|
behavior: HitTestBehavior.opaque,
|
|
|
|
onTap: () {
|
|
|
|
navigationType = 2;
|
|
|
|
navigationPosition();
|
|
|
|
},
|
|
|
|
child: Container(
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: navigationType == 2
|
|
|
|
? Color(0xFFE8FFF2)
|
|
|
|
: Colors.transparent,
|
|
|
|
borderRadius: BorderRadius.circular(23),
|
|
|
|
),
|
|
|
|
padding: EdgeInsets.symmetric(
|
|
|
|
vertical: 5.h, horizontal: 13.w),
|
|
|
|
child: Row(
|
|
|
|
children: [
|
|
|
|
if (navigationType == 2)
|
|
|
|
Image.asset(
|
|
|
|
"assets/image/icon_by_bike.webp",
|
|
|
|
fit: BoxFit.fill,
|
|
|
|
height: 16.h,
|
|
|
|
width: 14.w,
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.only(left: 2.w),
|
|
|
|
child: Text(
|
|
|
|
"骑行",
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
style: TextStyle(
|
|
|
|
color: navigationType == 2
|
|
|
|
? Color(0xFF32A060)
|
|
|
|
: Colors.black,
|
|
|
|
fontSize: 12.sp,
|
|
|
|
fontWeight: MyFontWeight.medium,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
),
|
|
|
|
))),
|
|
|
|
Expanded(
|
|
|
|
child: GestureDetector(
|
|
|
|
behavior: HitTestBehavior.opaque,
|
|
|
|
onTap: () {
|
|
|
|
navigationType = 1;
|
|
|
|
navigationPosition();
|
|
|
|
},
|
|
|
|
child: Container(
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: navigationType == 1
|
|
|
|
? Color(0xFFE8FFF2)
|
|
|
|
: Colors.transparent,
|
|
|
|
borderRadius: BorderRadius.circular(23),
|
|
|
|
),
|
|
|
|
padding: EdgeInsets.symmetric(
|
|
|
|
vertical: 5.h, horizontal: 13.w),
|
|
|
|
child: Row(
|
|
|
|
children: [
|
|
|
|
if (navigationType == 1)
|
|
|
|
Image.asset(
|
|
|
|
"assets/image/icon_walk.webp",
|
|
|
|
fit: BoxFit.fill,
|
|
|
|
height: 16.h,
|
|
|
|
width: 14.w,
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.only(left: 2.w),
|
|
|
|
child: Text(
|
|
|
|
"步行",
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
style: TextStyle(
|
|
|
|
color: navigationType == 1
|
|
|
|
? Color(0xFF32A060)
|
|
|
|
: Colors.black,
|
|
|
|
fontSize: 12.sp,
|
|
|
|
fontWeight: MyFontWeight.medium,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
),
|
|
|
|
))),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
],
|
|
|
|
))
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Widget navigationDistance() {
|
|
|
|
return Container(
|
|
|
|
height: 173.h,
|
|
|
|
padding: EdgeInsets.only(top: 16.h, left: 16.w, right: 16.w),
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: Colors.white,
|
|
|
|
boxShadow: [
|
|
|
|
BoxShadow(
|
|
|
|
color: Color(0x08213303),
|
|
|
|
offset: Offset(0, 2),
|
|
|
|
blurRadius: 4,
|
|
|
|
spreadRadius: 0,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
borderRadius: BorderRadius.vertical(
|
|
|
|
top: Radius.circular(8),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
child: Column(
|
|
|
|
// mainAxisAlignment: MainAxisAlignment.start,
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
Expanded(
|
|
|
|
child: Row(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
Text(
|
|
|
|
"${navigationType == 1 ? "步行" : navigationType == 2 ? "骑行" : navigationType == 3 ? "公交" : "驾车"}${(hours ?? "") + (minutes ?? "")}",
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 20.sp,
|
|
|
|
color: Color(0xFF0D0D0D),
|
|
|
|
fontWeight: MyFontWeight.bold,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.only(left: 40.w),
|
|
|
|
child: Text(
|
|
|
|
(distance ?? 0) > 1000
|
|
|
|
? S.of(context).gongli(
|
|
|
|
((distance ?? 0) / 1000 * 100).toInt() / 100.0)
|
|
|
|
: S
|
|
|
|
.of(context)
|
|
|
|
.mi(((distance ?? 0) * 100).toInt() / 100.0),
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 20.sp,
|
|
|
|
color: Color(0xFF0D0D0D),
|
|
|
|
fontWeight: MyFontWeight.bold,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
GestureDetector(
|
|
|
|
behavior: HitTestBehavior.opaque,
|
|
|
|
onTap: () {
|
|
|
|
setState(() {
|
|
|
|
navigationState = 1;
|
|
|
|
showMapSelect();
|
|
|
|
});
|
|
|
|
},
|
|
|
|
child: Container(
|
|
|
|
alignment: Alignment.center,
|
|
|
|
width: double.infinity,
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 10.h),
|
|
|
|
margin: EdgeInsets.only(bottom: 30.h),
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: Color(0xFF32A060),
|
|
|
|
borderRadius: BorderRadius.circular(23),
|
|
|
|
),
|
|
|
|
child: Text(
|
|
|
|
navigationType == 1
|
|
|
|
? "步行导航"
|
|
|
|
: navigationType == 2
|
|
|
|
? "骑行导航"
|
|
|
|
: navigationType == 3
|
|
|
|
? "公交导航"
|
|
|
|
: "驾车导航",
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 20.sp,
|
|
|
|
color: Colors.white,
|
|
|
|
fontWeight: MyFontWeight.medium,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
showMapSelect() {
|
|
|
|
showCupertinoModalPopup(
|
|
|
|
context: context,
|
|
|
|
builder: (context) {
|
|
|
|
return CupertinoActionSheet(
|
|
|
|
actions: [
|
|
|
|
CupertinoActionSheetAction(
|
|
|
|
child: Text(
|
|
|
|
"百度地图",
|
|
|
|
style: TextStyle(
|
|
|
|
fontWeight: MyFontWeight.regular,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
onPressed: () {
|
|
|
|
onOpenBaiduMapRoute();
|
|
|
|
Navigator.of(context).pop();
|
|
|
|
},
|
|
|
|
isDefaultAction: true,
|
|
|
|
isDestructiveAction: false,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
cancelButton: CupertinoActionSheetAction(
|
|
|
|
onPressed: () {
|
|
|
|
Navigator.of(context).pop();
|
|
|
|
},
|
|
|
|
child: Text(S.of(context).quxiao,
|
|
|
|
style: TextStyle(
|
|
|
|
color: Colors.blue,
|
|
|
|
),),
|
|
|
|
isDestructiveAction: true,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
List<Widget> itemServer(String businessService) {
|
|
|
|
if (businessService == null || businessService == "") return [];
|
|
|
|
var list = businessService.split(",");
|
|
|
|
return list
|
|
|
|
.map((e) => Container(
|
|
|
|
margin: EdgeInsets.only(right: 8.w),
|
|
|
|
child: RoundButton(
|
|
|
|
height: 17.h * AppUtils.textScale(context),
|
|
|
|
text: "$e",
|
|
|
|
backgroup: Color(0xFFFF7A1A),
|
|
|
|
padding: EdgeInsets.only(
|
|
|
|
left: 2.w,
|
|
|
|
right: 2.w,
|
|
|
|
),
|
|
|
|
fontSize: 10.sp,
|
|
|
|
textColor: Colors.white,
|
|
|
|
),
|
|
|
|
))
|
|
|
|
.toList();
|
|
|
|
}
|
|
|
|
|
|
|
|
BMFMapController _mapController;
|
|
|
|
BMFCoordinate latLng;
|
|
|
|
BMFCoordinate myLatLng;
|
|
|
|
BMFMarker bmfMarker;
|
|
|
|
|
|
|
|
onMapCreated(BMFMapController controller) {
|
|
|
|
_mapController = controller;
|
|
|
|
setState(() {
|
|
|
|
_mapController.showUserLocation(true);
|
|
|
|
_mapController.setCustomMapStyle('assets/map_style/chatian.sty', 0);
|
|
|
|
BMFUserLocationDisplayParam displayParam = BMFUserLocationDisplayParam(
|
|
|
|
locationViewOffsetX: 0,
|
|
|
|
locationViewOffsetY: 0,
|
|
|
|
accuracyCircleFillColor: Colors.red,
|
|
|
|
accuracyCircleStrokeColor: Colors.blue,
|
|
|
|
isAccuracyCircleShow: true,
|
|
|
|
locationViewImage: 'assets/image/icon_my_location.webp',
|
|
|
|
locationViewHierarchy:
|
|
|
|
BMFLocationViewHierarchy.LOCATION_VIEW_HIERARCHY_BOTTOM,
|
|
|
|
);
|
|
|
|
_mapController.updateLocationViewWithParam(displayParam);
|
|
|
|
addMarker();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
addMarker() async {
|
|
|
|
latLng = await AppUtils.coordConvert(BMFCoordinate(double.tryParse(widget.arguments["lat"]),
|
|
|
|
double.tryParse(widget.arguments["lng"])));
|
|
|
|
// latLng = BMFCoordinate(double.tryParse(widget.arguments["lat"]),
|
|
|
|
// double.tryParse(widget.arguments["lng"]));
|
|
|
|
|
|
|
|
if (bmfMarker == null && _mapController != null) {
|
|
|
|
bmfMarker = BMFMarker.icon(
|
|
|
|
position: latLng,
|
|
|
|
centerOffset: BMFPoint(0.5, 0.7),
|
|
|
|
enabled: false,
|
|
|
|
icon: "assets/image/icon_map_marker.webp",
|
|
|
|
draggable: false,
|
|
|
|
);
|
|
|
|
_mapController.addMarker(bmfMarker);
|
|
|
|
}
|
|
|
|
_mapController.setCenterCoordinate(latLng, true);
|
|
|
|
}
|
|
|
|
}
|