diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index c132438..3004b3f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -36,6 +36,9 @@ + + + -1) { + if (mapKey.length == 0 || key.length < mapKey.length) { + mapKey = key; + } + } + } + + _mapChsName = mapChsName[mapKey]; + + if (_mapChsName == null) { + _mapChsName = mapName + (mapName.length > 0 ? '地图' : ''); + } + return _mapChsName; +} + +// key 全部小写 +Map mapChsName = { + 'apple': '苹果地图', + 'google': '谷歌地图', + 'googlego': '谷歌地图轻量版', + 'amap': '高德地图', + 'baidu': '百度地图', + 'waze': '位智地图', + 'yandexmaps': 'Yandex地图', + 'yandexnavi': 'Yandex导航地图', + 'citymapper': '城市地图', + 'mapswithme': '离线地图', + 'osmand': 'OsmAnd地图', + 'doubleGis': 'doubleGis地图', + 'tencent': '腾讯地图', +}; + // Timer g_remindTimer; //定时提醒变量 // // // 设置定时提醒 diff --git a/lib/main.dart b/lib/main.dart index 61fbf21..29c2fec 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -119,7 +119,7 @@ class _MyAppState extends State { // g_bVoiceRemind = (null == g_bVoiceRemind) ? false : g_bVoiceRemind; // 默认关闭 g_bVoiceRemind = (null == g_bVoiceRemind) ? true : g_bVoiceRemind; // 默认开启 // print('g_bVoiceRemind = $g_bVoiceRemind'); - g_remindGap = await Storage.getInt('nRemindGap'); + g_remindGap = await Storage.getInt('nRemindGap'); g_remindGap = (null == g_remindGap) ? 60 : g_remindGap; // 提醒间隔默认为60S eventBus.fire(VoiceRemindUpdate('g_bVoiceRemind 数据已更新')); diff --git a/lib/pages/Works/DWDT/basic_map.dart b/lib/pages/Works/DWDT/basic_map.dart index a23d116..84bf989 100644 --- a/lib/pages/Works/DWDT/basic_map.dart +++ b/lib/pages/Works/DWDT/basic_map.dart @@ -4,8 +4,10 @@ import 'package:flutter_bmfmap/BaiduMap/bmfmap_map.dart'; import 'package:flutter_screenutil/screen_util.dart'; import 'package:hyzp_ybqx/components/commonFun.dart'; import 'package:hyzp_ybqx/components/hyxx_data_handle.dart'; +import 'package:map_launcher/map_launcher.dart'; import '../../../components/dioFun.dart'; +import '../../../services/Storage.dart'; import 'dwInfoDialog.dart'; import 'dwInfo_data.dart'; @@ -20,6 +22,11 @@ class BasicMap extends StatefulWidget { } class _BasicMapState extends State { + // 导航相关代码 + double destinationLatitude = 28.45382237207785; + double destinationLongitude = 104.7506958256658; + String destinationTitle = '珙县大坪上'; + Size screenSize; BMFMapOptions mapOptions; BMFMapController myMapController; @@ -32,9 +39,18 @@ class _BasicMapState extends State { } } + List availableMaps; + + void init() async { + // 获取用户选择的默认地图 + availableMaps = await MapLauncher.installedMaps; + } + @override void initState() { super.initState(); + init(); + mapOptions = BMFMapOptions( //center: BMFCoordinate(39.965, 116.404),//北京市 //30 116.395645038,39.9299857781 北京-北京市 @@ -291,8 +307,17 @@ class _BasicMapState extends State { .push( PageRouteBuilder( opaque: false, - pageBuilder: (context, animation, secondaryAnimation) => - dwInfoDialog(id: id, dwIndex: dwIndex, title: title, content: content), + pageBuilder: (context, animation, secondaryAnimation) => dwInfoDialog( + id: id, + dwIndex: dwIndex, + title: title, + content: content, + parentContext: context, + destinationLatitude: double.parse(listCoordinate[1]), + destinationLongitude: double.parse(listCoordinate[0]), + destinationTitle: listDwinfoGetList2[dwIndex]["dwmc"], + availableMaps: availableMaps, + ), ), ) .then((value) async { diff --git a/lib/pages/Works/DWDT/dwInfoDialog.dart b/lib/pages/Works/DWDT/dwInfoDialog.dart index 7437318..6594dd5 100644 --- a/lib/pages/Works/DWDT/dwInfoDialog.dart +++ b/lib/pages/Works/DWDT/dwInfoDialog.dart @@ -1,21 +1,38 @@ import 'package:flutter/material.dart'; +import 'package:geolocator/geolocator.dart'; import 'package:hyzp_ybqx/components/dioFun.dart'; +import 'package:map_launcher/map_launcher.dart'; //import 'package:hyzp_ybqx/widget/player_pro.dart'; import '../../../components/commonFun.dart'; +import '../../../services/Storage.dart'; +import 'maps_sheet.dart'; //确认对话框 class dwInfoDialog extends Dialog { - dwInfoDialog({@required this.id, this.title = "", @required this.dwIndex, this.content}); + dwInfoDialog({ + @required this.id, + this.title = "", + @required this.dwIndex, + this.content, + // 导航相关参数 + this.parentContext, + this.destinationLatitude, + this.destinationLongitude, + this.destinationTitle, + this.availableMaps, + }); int dwIndex; String id; String title; String content; bool ret = false; + BuildContext parentContext; @override Widget build(BuildContext context) { + getCurrentPosition(); Size mediaSize = MediaQuery.of(context).size; return WillPopScope( child: Material( @@ -90,9 +107,9 @@ class dwInfoDialog extends Dialog { onPressed: () async { ret = true; getingDwVideo = false; - Navigator.pop(context, ret); //关闭弹框,返回sRet + navigationMap(context); }, - child: Text("确认"), + child: Text("导航"), ), RaisedButton( child: Text("取消"), @@ -115,4 +132,102 @@ class dwInfoDialog extends Dialog { }, ); } + + // 导航相关代码 + double destinationLatitude = 28.45382237207785; + double destinationLongitude = 104.7506958256658; + String destinationTitle = '珙县大坪上'; + + double originLatitude; + double originLongitude; + String originTitle = '我的位置'; + + List waypoints = [ + // Coords(37.7705112, -122.4108267), + // Coords(37.6988984, -122.4830961), + // Coords(37.7935754, -122.483654), + ]; + + DirectionsMode directionsMode = DirectionsMode.driving; + + List availableMaps; + + // String defaultMapName = 'Amap'; + String defaultMapName = g_defaultMapName; + AvailableMap defalutMap; + + void getCurrentPosition() async { + print('getCurrentPosition begin'); + + // 是否保存默认地图 + g_bSaveDefaultMap = await Storage.getBool('bSaveDefaultMap'); + g_bSaveDefaultMap = (null == g_bSaveDefaultMap) ? false : g_bSaveDefaultMap; // 默认不保存 + // 用户选择的默认地图名称 + g_defaultMapName = await Storage.getString('defaultMapName'); + g_defaultMapName = (null == g_defaultMapName) ? '' : g_defaultMapName; // 默认为空字符串 + defaultMapName = g_defaultMapName; + + // 获取用户选择的默认地图 + // availableMaps = await MapLauncher.installedMaps; // 为避免延迟错乱,该变量由父组件传入 + if (defaultMapName != null && defaultMapName.length > 0) { + for (var map in availableMaps) { + if (defaultMapName.toLowerCase() == map.mapName.toLowerCase()) { + defalutMap = map; + break; + } + } + } + + await Geolocator.getCurrentPosition().then((Position value) { + originLatitude = value.latitude; + originLongitude = value.longitude; + print('value = ${value.toString()}'); + // value = Latitude: 28.796201, Longitude: 104.607751 + print('getCurrentPosition end'); + }); + } + + navigationMap(BuildContext context) { + print('this.defalutMap = ${defalutMap}'); + if (defalutMap != null) { + defalutMap.showDirections( + destination: Coords( + destinationLatitude, + destinationLongitude, + ), + destinationTitle: destinationTitle, + origin: originLatitude == null || originLongitude == null + ? null + : Coords(originLatitude, originLongitude), + originTitle: originTitle, + waypoints: waypoints, + directionsMode: directionsMode, + ); + } else { + MapsSheet.show( + context: parentContext, + onMapTap: (map) { + if (g_bSaveDefaultMap) { + g_defaultMapName = map.mapName; + Storage.setString('defaultMapName', g_defaultMapName); + } + + map.showDirections( + destination: Coords( + destinationLatitude, + destinationLongitude, + ), + destinationTitle: destinationTitle, + origin: originLatitude == null || originLongitude == null + ? null + : Coords(originLatitude, originLongitude), + originTitle: originTitle, + waypoints: waypoints, + directionsMode: directionsMode, + ); + }, + ); + } + Navigator.pop(context, ret); //关闭弹框,返回sRet + } } diff --git a/lib/pages/Works/DWDT/maps_sheet.dart b/lib/pages/Works/DWDT/maps_sheet.dart new file mode 100644 index 0000000..a2bda47 --- /dev/null +++ b/lib/pages/Works/DWDT/maps_sheet.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:map_launcher/map_launcher.dart'; + +class MapsSheet { + static show({ + @required BuildContext context, + @required Function(AvailableMap map) onMapTap, + }) async { + final availableMaps = await MapLauncher.installedMaps; + + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return SafeArea( + child: Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Container( + child: Wrap( + children: [ + for (var map in availableMaps) + ListTile( + onTap: () { + print('map.mapName = ${map.mapName}'); + // map.mapName = Amap + Navigator.pop(context); + onMapTap(map); + }, + title: Text(map.mapName), + leading: SvgPicture.asset( + map.icon, + height: 30.0, + width: 30.0, + ), + ), + ], + ), + ), + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/lib/pages/tabs/page4_myMsics_new.dart b/lib/pages/tabs/page4_myMsics_new.dart index fcfc8bb..fe8c3e5 100644 --- a/lib/pages/tabs/page4_myMsics_new.dart +++ b/lib/pages/tabs/page4_myMsics_new.dart @@ -16,6 +16,7 @@ import 'package:hyzp_ybqx/pages/Works/TJXX/tj_data.dart'; import 'package:hyzp_ybqx/pages/tabs/page5_userManager.dart'; import 'package:hyzp_ybqx/pages/tabs/page6_download.dart'; import 'package:hyzp_ybqx/pages/tabs/page7_setRemind.dart'; +import 'package:hyzp_ybqx/pages/tabs/page8_defaultMap.dart'; import 'package:hyzp_ybqx/services/EventBus.dart'; import 'package:hyzp_ybqx/widget/JdButton.dart'; import 'package:package_info/package_info.dart'; @@ -111,35 +112,35 @@ class _Page4_MyMsicsNewState extends State static onNullFun() {} Widget _getListTile( - title, { - String leadPath = '', - Color leadColor, - Color textColor, - onTapFun = onNullFun, - onLongPressFun = onNullFun, - size = 16.0, - bool bBadge = false, - Widget trailWidget = const Icon(Icons.arrow_forward_ios), - }) { + title, { + String leadPath = '', + Color leadColor, + Color textColor, + onTapFun = onNullFun, + onLongPressFun = onNullFun, + size = 16.0, + bool bBadge = false, + Widget trailWidget = const Icon(Icons.arrow_forward_ios), + }) { // print("_getListTile bVoiceRemind = $bVoiceRemind"); // _getListTile bVoiceRemind = false return Column( children: [ ListTile( leading: bBadge ? Badge( - position: BadgePosition.topEnd(top: -7, end: -12), - badgeContent: null, - child: Image.asset( - leadPath, - height: ScreenUtil().setHeight(78), - fit: BoxFit.fitHeight, - ), - ) + position: BadgePosition.topEnd(top: -7, end: -12), + badgeContent: null, + child: Image.asset( + leadPath, + height: ScreenUtil().setHeight(78), + fit: BoxFit.fitHeight, + ), + ) : Image.asset( - leadPath, - height: ScreenUtil().setHeight(78), - fit: BoxFit.fitHeight, - ), + leadPath, + height: ScreenUtil().setHeight(78), + fit: BoxFit.fitHeight, + ), title: Text(title, style: TextStyle(fontSize: size, color: textColor)), trailing: trailWidget, contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0), @@ -202,6 +203,10 @@ class _Page4_MyMsicsNewState extends State leadPath: 'assets/images/账户管理.png', leadColor: _deepBlueColor, onTapFun: OnTap_user_manager), + _getListTile('默认导航', + leadPath: 'assets/images/默认地图3.png', + leadColor: _deepBlueColor, + onTapFun: OnTap_DefaultMap), //bNewVer:是否发现新版本 _getListTile('版本更新', leadPath: 'assets/images/版本更新.png', @@ -213,9 +218,7 @@ class _Page4_MyMsicsNewState extends State leadColor: _deepBlueColor, onTapFun: OnTap_download), _getListTile('提醒设置', - leadPath: 'assets/images/语音提醒.png', - leadColor: _deepGreyColor, - onTapFun: OnTap_Remind), + leadPath: 'assets/images/语音提醒.png', leadColor: _deepGreyColor, onTapFun: OnTap_Remind), _getListTile('关于', leadPath: 'assets/images/关于.png', leadColor: _deepBlueColor, onTapFun: OnTap_MyAbout) @@ -511,6 +514,10 @@ class _Page4_MyMsicsNewState extends State Navigator.of(context).push(MaterialPageRoute(builder: (context) => page5_userManager())); } + OnTap_DefaultMap() async { + Navigator.of(context).push(MaterialPageRoute(builder: (context) => page8_defaultMap())); + } + OnTap_download() { Navigator.of(context).push(MaterialPageRoute(builder: (context) => page6_download())); } diff --git a/lib/pages/tabs/page8_defaultMap.dart b/lib/pages/tabs/page8_defaultMap.dart new file mode 100644 index 0000000..7f8723c --- /dev/null +++ b/lib/pages/tabs/page8_defaultMap.dart @@ -0,0 +1,284 @@ +import 'package:badges/badges.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:hyzp_ybqx/pages/Login/FaceReg.dart'; +import 'package:hyzp_ybqx/pages/Login/ModifyPassword.dart'; +import 'package:hyzp_ybqx/services/Storage.dart'; + +import '../../components/commonFun.dart'; +import '../../widget/JdButton.dart'; + +class page8_defaultMap extends StatefulWidget { + page8_defaultMap({Key key}) : super(key: key); + + _LoginPageState createState() => _LoginPageState(); +} + +class _LoginPageState extends State { + bool bSaveDefaultMap = false; + String defaultMapName = ''; + + dispose() { + super.dispose(); + } + + @override + void initState() { + super.initState(); + init(); + } + + void init() async { + // 从磁盘读取变量 + // 是否保存默认地图 + g_bSaveDefaultMap = await Storage.getBool('bSaveDefaultMap'); + g_bSaveDefaultMap = (null == g_bSaveDefaultMap) ? false : g_bSaveDefaultMap; // 默认不保存 + // 用户选择的默认地图名称 + g_defaultMapName = await Storage.getString('defaultMapName'); + g_defaultMapName = (null == g_defaultMapName) ? '' : g_defaultMapName; // 默认为空字符串 + + bSaveDefaultMap = g_bSaveDefaultMap; + // bSaveDefaultMap = false; + // defaultMapName = g_defaultMapName; + // defaultMapName = '高德地图'; + // defaultMapName = getMapChsName('amap'); + defaultMapName = getMapChsName(g_defaultMapName); + setState(() {}); + } + + //////// + static onNullFun() {} + + Widget _getListTile( + title, { + String leadPath = '', + Color leadColor, + Color textColor, + onTapFun = onNullFun, + onLongPressFun = onNullFun, + size = 16.0, + bool bBadge = false, + Widget trailWidget = const Icon(Icons.arrow_forward_ios), + }) { + // print("_getListTile bSaveDefaultMap = $bSaveDefaultMap "); // _getListTile bSaveDefaultMap = false + return Column( + children: [ + ListTile( + leading: bBadge + ? Badge( + position: BadgePosition.topEnd(top: -7, end: -12), + badgeContent: null, + child: Image.asset( + leadPath, + height: ScreenUtil().setHeight(78), + fit: BoxFit.fitHeight, + // color: leadColor, // 无效 + ), + ) + : Image.asset( + leadPath, + height: ScreenUtil().setHeight(78), + fit: BoxFit.fitHeight, + ), + title: Text(title, style: TextStyle(fontSize: size, color: textColor)), + trailing: trailWidget, + contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0), + enabled: true, + onTap: onTapFun, + onLongPress: onLongPressFun, + ), + Divider( + height: 1.0, + ), + ], + ); + } + + List _listViewUser = []; + + Color _greenColor = Color.fromRGBO(36, 206, 192, 1); //绿色 + Color _deepBlueColor = Color.fromRGBO(79, 118, 230, 1); //深蓝 + Color _deepGreyColor = Color.fromRGBO(116, 139, 161, 1); //深灰 + Color _ligthBlueColor = Color.fromRGBO(80, 159, 245, 1); //亮蓝 + + OnTap_FaceReg() async { + Navigator.of(context).push(MaterialPageRoute(builder: (context) => FaceReg())); + } + + OnTap_modify_password() { + Navigator.of(context).push(MaterialPageRoute(builder: (context) => ModifyPassword())); + } + + OnTap_Remind() { + setState(() { + bSaveDefaultMap = !bSaveDefaultMap; + print("bSaveDefaultMap = $bSaveDefaultMap"); + }); + } + + Widget getTextField() { + return Container( + width: ScreenUtil().setWidth(400), + child: TextField( + readOnly: !bSaveDefaultMap, + focusNode: FocusNode(), + textAlignVertical: TextAlignVertical(y: 1.0), + controller: TextEditingController.fromValue(TextEditingValue( + text: defaultMapName.toString(), + // 保持光标在最后 + selection: TextSelection.fromPosition(TextPosition( + affinity: TextAffinity.downstream, offset: defaultMapName.toString().length)))), + maxLines: 1, + keyboardType: TextInputType.text, + decoration: InputDecoration( + //contentPadding: EdgeInsets.only(bottom: 16), + // hintText: widget.text, + // border: OutlineInputBorder( + // borderRadius: BorderRadius.circular(30), borderSide: BorderSide.none), + border: UnderlineInputBorder(borderSide: BorderSide(color: Colors.lightBlue)), + focusedBorder: UnderlineInputBorder(borderSide: BorderSide(color: Colors.lightBlue)), + enabledBorder: UnderlineInputBorder(borderSide: BorderSide(color: Colors.lightBlue)), + ), + onChanged: (v) { + defaultMapName = v; + }, + ), + ); + } + + Widget getText(String text) { + return Container( + child: Text(text, + style: TextStyle( + fontSize: 16, + color: Colors.blueAccent, + fontWeight: FontWeight.bold, + decoration: TextDecoration.underline, + )), + ); + } + + //////// + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: PreferredSize( + preferredSize: Size.fromHeight(ScreenUtil().setHeight(173)), // 设置appBar高度 + // 设置appBar高度 + child: AppBar( + automaticallyImplyLeading: false, + centerTitle: true, + titleSpacing: 0.0, + //设置title的左边距 + flexibleSpace: Container( + //SizedBox(height: ScreenUtil().statusBarHeight), //显示顶部状态栏 + // SizedBox(height: ScreenUtil().setHeight(10)), //显示顶部状态栏 + padding: EdgeInsets.only(top: ScreenUtil().statusBarHeight), //留出顶部状态栏高度 + child: Container( + //height: ScreenUtil().setHeight(173), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [ + Color.fromRGBO(12, 186, 156, 1), + Color.fromRGBO(39, 127, 235, 1), + ], + ), + ), + // decoration: BoxDecoration( + // gradient: LinearGradient(colors: [ + // Color(0xFF0018EB), + // Color(0xFF01C1D9), + // ], begin: Alignment.bottomCenter, end: Alignment.topCenter), + // ), + ), + ), + title: Padding( + padding: EdgeInsets.only(left: 0, right: 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + getIconAndTextButton( + iconColor: Colors.white, + iconData: Icons.chevron_left_outlined, + onPress: () { + Navigator.pop(context); + }, + ), + Expanded( + child: Text("默认导航设置", + style: TextStyle(color: Colors.white, fontSize: 20), + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis), + ), + SizedBox(width: 50), + ], + ), + ), + ), + ), + body: Container( + padding: EdgeInsets.only(top: 30, bottom: 20, left: 20, right: 20), + child: ListView( + children: [ + Center( + child: Container( + margin: EdgeInsets.only(top: 30), + height: ScreenUtil().setWidth(160), + width: ScreenUtil().setWidth(160), + //child: Image.asset('assets/images/user.png', fit: BoxFit.cover), + child: Image.asset('assets/images/ybsthbj.png', fit: BoxFit.fitHeight), + ), + ), + SizedBox(height: 50), + _getListTile('保存默认导航地图', + leadPath: 'assets/images/地图选中.png', + leadColor: _deepGreyColor, + // textColor: bSaveDefaultMap ? Colors.blue : null, + onTapFun: OnTap_Remind, + trailWidget: bSaveDefaultMap + ? Icon(Icons.check_box, color: Colors.blue) + : Icon(Icons.check_box_outline_blank, color: Colors.blueAccent)), + _getListTile('已选默认导航地图:', + leadPath: 'assets/images/用户选择.png', + leadColor: _deepBlueColor, + trailWidget: getText(defaultMapName)), + SizedBox(height: 60), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + JdButton( + height: 128, + width: 282, + //height: 126, + text: "确认", + color: Colors.blueAccent, + onTop: () async { + g_bSaveDefaultMap = bSaveDefaultMap; + await Storage.setBool('bSaveDefaultMap', g_bSaveDefaultMap); + if (!g_bSaveDefaultMap) { + await Storage.setString('defaultMapName', ''); + } + Navigator.pop(context); + }, + ), + JdButton( + height: 128, + width: 282, + //height: 126, + text: "取消", + color: Colors.blueAccent, + onTop: () { + Navigator.pop(context); + }, + ) + ], + ), + ], + ), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index c7dd44f..7762155 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -377,6 +377,13 @@ packages: relative: true source: path version: "0.0.3" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.19.1" flutter_swiper: dependency: "direct main" description: @@ -408,6 +415,27 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "4.0.1" + geolocator: + dependency: "direct main" + description: + name: geolocator + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.2.1" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.9" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.1" get_it: dependency: "direct main" description: @@ -485,6 +513,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" + map_launcher: + dependency: "direct main" + description: + name: map_launcher + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.3+1" matcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index a944aa0..d866097 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -210,6 +210,11 @@ dependencies: # 添加水印插件 disable_screenshots: ^0.1.0 + # 导航相关插件 + map_launcher: ^1.1.3+1 + flutter_svg: ^0.19.1 + geolocator: ^6.2.1 + dev_dependencies: flutter_test: sdk: flutter