重做一键报警页面,升级屏幕适配库,添加报警拨号页面跳转

hmxc
张萌 4 years ago
parent 1d38844e9d
commit fe4f94e209

@ -5,6 +5,8 @@
additional functionality it is fine to subclass or reimplement additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. --> FlutterApplication and put your custom class here. -->
<application android:name="io.flutter.app.FlutterApplication" android:label="小蜜蜂智慧社区" android:icon="@mipmap/logo" android:networkSecurityConfig="@xml/network_security_config"> <application android:name="io.flutter.app.FlutterApplication" android:label="小蜜蜂智慧社区" android:icon="@mipmap/logo" android:networkSecurityConfig="@xml/network_security_config">
<meta-data android:name="com.amap.api.v2.apikey"
android:value="ee697f99e8381b7efde08b9976052bd0"/>
<activity android:name=".MainActivity" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> <activity android:name=".MainActivity" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as <!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user the Android process has started. This theme is visible to the user
@ -17,6 +19,7 @@
gap between the end of Android's launch screen and the painting of gap between the end of Android's launch screen and the painting of
Flutter's first frame. --> Flutter's first frame. -->
<meta-data android:name="io.flutter.embedding.android.SplashScreenDrawable" android:resource="@drawable/launch_background" /> <meta-data android:name="io.flutter.embedding.android.SplashScreenDrawable" android:resource="@drawable/launch_background" />
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER"/>
@ -26,6 +29,18 @@
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data android:name="flutterEmbedding" android:value="2" /> <meta-data android:name="flutterEmbedding" android:value="2" />
</application> </application>
<!--允许程序打开网络套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序设置内置sd卡的写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允许程序获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允许程序访问WiFi网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允许程序读写手机状态和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 保存照片到相册 --> <!-- 保存照片到相册 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 打开相册选取图片 --> <!-- 打开相册选取图片 -->

@ -1,6 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:akuCommunity/pages/sign/sign_in_page.dart'; import 'package:akuCommunity/pages/sign/sign_in_page.dart';
import 'package:amap_map_fluttify/amap_map_fluttify.dart';
import 'package:ani_route/ani_route.dart'; import 'package:ani_route/ani_route.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
@ -14,7 +15,9 @@ import 'package:oktoast/oktoast.dart';
import 'package:akuCommunity/routers/router_init.dart'; import 'package:akuCommunity/routers/router_init.dart';
void main() { void main() {
WidgetsFlutterBinding.ensureInitialized();
ARoute.init(true); ARoute.init(true);
AmapLocation.instance.init(iosKey: 'ios key');
runApp(MyApp()); runApp(MyApp());
} }

@ -1,263 +0,0 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:sliding_up_panel/sliding_up_panel.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong/latlong.dart';
import 'package:akuCommunity/utils/screenutil.dart';
import 'package:akuCommunity/widget/common_app_bar.dart';
class OneAlarmPage extends StatefulWidget {
OneAlarmPage({Key key}) : super(key: key);
@override
_OneAlarmPageState createState() => _OneAlarmPageState();
}
class _OneAlarmPageState extends State<OneAlarmPage> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: PreferredSize(
child: CommonAppBar(
title: '一键报警',
subtitle: '功能说明',
),
preferredSize: Size.fromHeight(kToolbarHeight),
),
body: Stack(
alignment: Alignment.topCenter,
children: <Widget>[
SlidingUpPanel(
maxHeight: Screenutil.length(271),
minHeight: Screenutil.length(271),
parallaxOffset: .5,
panelSnapping: false,
body: _body(),
panelBuilder: (sc) => _panel(sc),
),
Positioned(
right: Screenutil.length(34),
bottom: Screenutil.length(304),
child: InkWell(
child: Container(
height: Screenutil.length(66),
width: Screenutil.length(66),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(Screenutil.length(66)),
boxShadow: <BoxShadow>[
BoxShadow(
color: Color(0xff000000).withOpacity(0.12),
offset: Offset(1, 1))
],
),
child: Icon(
Icons.gps_fixed,
size: Screenutil.length(44),
color: Color(0xff666666),
),
),
),
),
Positioned(
top: Screenutil.length(32),
child: Container(
width: Screenutil.length(686),
padding: EdgeInsets.only(
top: Screenutil.length(24),
bottom: Screenutil.length(24),
left: Screenutil.length(32),
),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.9),
borderRadius: BorderRadius.circular(12),
boxShadow: <BoxShadow>[
BoxShadow(
color: Color(0xff5C5959).withOpacity(0.2),
offset: Offset(1, 1))
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"当前位置(仅供参考)",
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xff333333),
fontSize: Screenutil.size(28),
),
),
Container(
margin: EdgeInsets.only(top: Screenutil.length(20)),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Icon(
Entypo.location_pin,
color: Color(0xff666666),
size: Screenutil.size(28),
),
Container(
margin: EdgeInsets.only(left: Screenutil.length(10)),
child: Text(
"广东省深圳市龙岗区吉信街22-1附近",
style: TextStyle(
color: Color(0xff666666),
fontSize: Screenutil.size(28),
),
),
),
],
),
),
],
),
),
),
],
),
);
}
Widget _panel(ScrollController sc) {
return MediaQuery.removePadding(
context: context,
removeTop: true,
child: Stack(
overflow: Overflow.visible,
children: [
ListView(
controller: sc,
children: [
Container(
margin: EdgeInsets.only(top: Screenutil.length(146)),
width: MediaQuery.of(context).size.width,
alignment: Alignment.center,
child: Text(
'谎报警情,依法追责',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: Screenutil.size(32),
color: Color(0xffe02020),
),
),
),
Container(
margin: EdgeInsets.only(top: Screenutil.length(8)),
width: MediaQuery.of(context).size.width,
alignment: Alignment.center,
child: Text(
'谎报警情将可能被处以五日以上十日以下拘留',
style: TextStyle(
fontSize: Screenutil.size(24),
color: Color(0xff999999),
),
),
),
],
),
Positioned(
top: -Screenutil.length(98),
width: MediaQuery.of(context).size.width,
child: Center(
child: Container(
padding: EdgeInsets.all(Screenutil.length(12)),
height: Screenutil.length(196),
width: Screenutil.length(196),
decoration: BoxDecoration(
color: Colors.white,
borderRadius:
BorderRadius.all(Radius.circular(Screenutil.length(196))),
),
child: Container(
height: Screenutil.length(172),
width: Screenutil.length(172),
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.bottomLeft,
end: Alignment.topLeft,
colors: [Color(0xffef0909), Color(0xffff8880)],
),
borderRadius: BorderRadius.all(
Radius.circular(Screenutil.length(172))),
boxShadow: <BoxShadow>[
BoxShadow(
color: Color(0xfffd7770).withOpacity(0.33),
offset: Offset(0, Screenutil.length(10)),
blurRadius: Screenutil.length(20),
spreadRadius: Screenutil.length(4),
)
],
),
child: Icon(
Feather.phone_call,
color: Colors.white,
size: Screenutil.size(87),
),
),
),
),
),
],
),
);
}
Widget _button(String label, IconData icon, Color color) {
return Column(
children: <Widget>[
Container(
padding: const EdgeInsets.all(16.0),
child: Icon(
icon,
color: Colors.white,
),
decoration:
BoxDecoration(color: color, shape: BoxShape.circle, boxShadow: [
BoxShadow(
color: Color.fromRGBO(0, 0, 0, 0.15),
blurRadius: 8.0,
)
]),
),
SizedBox(
height: 12.0,
),
Text(label),
],
);
}
Widget _body() {
return FlutterMap(
options: MapOptions(
center: LatLng(22.3817, 114.05),
zoom: 13,
maxZoom: 15,
),
layers: [
TileLayerOptions(
urlTemplate: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}",
),
MarkerLayerOptions(markers: [
Marker(
point: LatLng(22.3817, 114.05),
builder: (ctx) => Icon(
Icons.location_on,
color: Colors.blue,
size: 48.0,
),
height: 60),
]),
],
);
}
}

@ -0,0 +1,268 @@
import 'package:akuCommunity/utils/screenutil.dart';
import 'package:akuCommunity/widget/common_app_bar.dart';
import 'package:flutter/material.dart';
import 'package:amap_map_fluttify/amap_map_fluttify.dart';
import 'package:amap_location_fluttify/amap_location_fluttify.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:url_launcher/url_launcher.dart';
class PermissionUtil {
static Future<bool> getLocationPermission() async {
return await Permission.locationWhenInUse.request().isGranted;
}
}
class AlarmPage extends StatefulWidget {
AlarmPage({Key key, bundle}) : super(key: key);
@override
_AlarmPageState createState() => _AlarmPageState();
}
class _AlarmPageState extends State<AlarmPage> {
final _option = MyLocationOption(
show: true,
myLocationType: MyLocationType.Locate,
);
Future<void> _makephonenum(String url)async{
(await canLaunch(url))?await launch(url):throw 'Could not launch $url';
}
AmapController _amapController;
Location _location;
@override
void initState() {
super.initState();
AmapLocation.instance.fetchLocation().then((location) {
_location = location;
setState(() {});
});
PermissionUtil.getLocationPermission();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: PreferredSize(
child: CommonAppBar(
title: '一键报警',
subtitle: '功能说明',
),
preferredSize: Size.fromHeight(kToolbarHeight),
),
body: Stack(
alignment: Alignment.topCenter,
children: [
AmapView(
onMapCreated: (controller) async {
_amapController = controller;
await _amapController.showMyLocation(_option);
},
mapType: MapType.Standard,
showZoomControl: false,
zoomLevel: 16,
),
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
margin: EdgeInsets.only(top: Screenutil.length(32)),
width: 686.w,
height: Screenutil.length(148),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.9),
borderRadius: BorderRadius.circular(16),
boxShadow: <BoxShadow>[
BoxShadow(
color: Color(0xE8FFFFFF).withOpacity(0.10),
offset: Offset(0, 2)),
]),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: Screenutil.length(24)),
Container(
margin: EdgeInsets.only(
top: Screenutil.length(24),
left: Screenutil.length(32)),
child: Text(
'当前位置(仅供参考)',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xff333333),
fontSize: Screenutil.size(28)),
),
),
Container(
margin: EdgeInsets.only(
top: Screenutil.length(20),
left: Screenutil.length(32)),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Icon(
Entypo.location_pin,
color: Color(0xff666666),
size: Screenutil.size(29),
),
Container(
margin:
EdgeInsets.only(left: Screenutil.length(5)),
child: Text(
(_location == null)
? '加载中……'
: _location.aoiName,
style: TextStyle(
color: Color(0xff666666),
fontSize: Screenutil.size(28),
),
),
),
],
),
),
],
)),
Spacer(),
Row(
children: [
Spacer(),
Container(
alignment: Alignment.center,
width: Screenutil.length(66),
height: Screenutil.length(66),
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(Screenutil.length(66)),
boxShadow: <BoxShadow>[
BoxShadow(
color: Color(0x1F000000),
offset: Offset(3, 4),
blurRadius: 6,
spreadRadius: 1,
)
]),
child: FlatButton(
padding: EdgeInsets.zero,
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(Screenutil.length(66))),
color: Color(0xFFFFFFFF),
onPressed: () {
_amapController?.setCenterCoordinate(
_location.latLng);
Future.delayed(Duration(milliseconds: 500), () {
if (mounted) _amapController.setZoomLevel(16);
});
},
child: Icon(
Icons.location_searching,
size: Screenutil.length(44),
),
),
),
SizedBox(width: Screenutil.length(34)),
],
),
SizedBox(
height: Screenutil.length(29),
),
Container(
width: double.infinity,
height: Screenutil.length(271),
alignment: Alignment.center,
decoration:
BoxDecoration(color: Color(0xFFFFFFFF).withOpacity(0.9)),
child: Stack(
overflow: Overflow.visible,
alignment: Alignment.topCenter,
children: [
Positioned(
bottom: Screenutil.length(173),
child: Container(
padding: EdgeInsets.all(Screenutil.length(12)),
height: Screenutil.length(196),
width: Screenutil.length(196),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(
Radius.circular(Screenutil.length(196))),
),
child: Container(
height: Screenutil.length(172),
width: Screenutil.length(172),
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.bottomLeft,
end: Alignment.topLeft,
colors: [Color(0xffef0909), Color(0xffff8880)],
),
borderRadius: BorderRadius.all(
Radius.circular(Screenutil.length(172))),
boxShadow: <BoxShadow>[
BoxShadow(
color: Color(0xfffd7770).withOpacity(0.33),
offset: Offset(0, Screenutil.length(10)),
blurRadius: Screenutil.length(20),
spreadRadius: Screenutil.length(4),
)
],
),
child: FlatButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(
Screenutil.length(172))),
onPressed: () {
setState(() {
_makephonenum('tel:110');
});
},
child: Icon(
Feather.phone_call,
color: Colors.white,
size: Screenutil.size(87),
),
),
),
),
),
Column(
children: [
SizedBox(height: Screenutil.length(146)),
Text(
'谎报警情,依法追责',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: Screenutil.size(32),
color: Color(0xffe02020),
),
),
Spacer(),
Text(
'谎报警情将可能被处以五日以上十日以下拘留',
style: TextStyle(
fontSize: Screenutil.size(24),
color: Color(0xff999999),
),
),
SizedBox(height: 19.5),
],
),
],
),
),
],
)
],
),
);
}
}

@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter_beautiful_popup/main.dart'; import 'package:flutter_beautiful_popup/main.dart';
import 'package:akuCommunity/utils/screenutil.dart'; import 'package:akuCommunity/utils/screenutil.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class ExplainTemplate extends BeautifulPopupTemplate { class ExplainTemplate extends BeautifulPopupTemplate {
@ -14,7 +15,7 @@ class ExplainTemplate extends BeautifulPopupTemplate {
@override @override
Color get primaryColor => options.primaryColor ?? Color(0xff15c0ec); Color get primaryColor => options.primaryColor ?? Color(0xff15c0ec);
@override @override
final maxWidth = Screenutil.length(400); final maxWidth = 400.w;
@override @override
final maxHeight = Screenutil.length(617); final maxHeight = Screenutil.length(617);
@override @override

@ -176,7 +176,7 @@ class _SignInPageState extends State<SignInPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
double _statusHeight = MediaQuery.of(context).padding.top; double _statusHeight = MediaQuery.of(context).padding.top;
ScreenUtil.init(context, width: 750, height: 1334, allowFontScaling: true); ScreenUtil.init(context, designSize: Size(750, 1334), allowFontScaling: true);
return Scaffold( return Scaffold(
backgroundColor: Colors.white, backgroundColor: Colors.white,
appBar: _appBar(), appBar: _appBar(),

@ -35,7 +35,7 @@ class _TabNavigatorState extends State<TabNavigator> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
ScreenUtil.init(context, width: 750, height: 1334, allowFontScaling: true); ScreenUtil.init(context, designSize: Size(750, 1334), allowFontScaling: true);
double iconSize = ScreenUtil().setWidth(44); double iconSize = ScreenUtil().setWidth(44);
// //
List<BottomNavigationBarItem> _bottomNav = <BottomNavigationBarItem>[ List<BottomNavigationBarItem> _bottomNav = <BottomNavigationBarItem>[

@ -1,3 +1,5 @@
import 'package:akuCommunity/pages/one_alarm/widget/alarm_page.dart';
import 'package:ani_route/ani_route.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:akuCommunity/utils/screenutil.dart'; import 'package:akuCommunity/utils/screenutil.dart';
@ -195,8 +197,7 @@ class _TotalApplicationsPageState extends State<TotalApplicationsPage> {
context, PageName.goods_manage_page.toString()); context, PageName.goods_manage_page.toString());
break; break;
case '一键报警': case '一键报警':
Navigator.pushNamed( ARoute.push(context, AlarmPage());
context, PageName.one_alarm_page.toString());
break; break;
default: default:
break; break;

@ -1,3 +1,4 @@
import 'package:akuCommunity/pages/one_alarm/widget/alarm_page.dart';
import 'package:akuCommunity/pages/setting_page/agreement_page/privacy_page.dart'; import 'package:akuCommunity/pages/setting_page/agreement_page/privacy_page.dart';
import 'package:fluro/fluro.dart'; import 'package:fluro/fluro.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -168,6 +169,7 @@ enum PageName {
things_evaluate_page, things_evaluate_page,
agreement_page, agreement_page,
privacy_page, privacy_page,
alarm_page,
} }
class Bundle { class Bundle {
@ -368,4 +370,6 @@ final Map<PageName, PageBuilder> pageRoutes = {
PageBuilder(builder: (bundle) => ThingsCreatePage(bundle: bundle)), PageBuilder(builder: (bundle) => ThingsCreatePage(bundle: bundle)),
PageName.things_evaluate_page: PageName.things_evaluate_page:
PageBuilder(builder: (bundle) => ThingsEvaluatePage(bundle: bundle)), PageBuilder(builder: (bundle) => ThingsEvaluatePage(bundle: bundle)),
PageName.alarm_page:
PageBuilder(builder: (bundle)=>AlarmPage(bundle:bundle),)
}; };

@ -8,6 +8,34 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "7.0.0" version: "7.0.0"
amap_core_fluttify:
dependency: transitive
description:
name: amap_core_fluttify
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.12.0"
amap_location_fluttify:
dependency: "direct main"
description:
name: amap_location_fluttify
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.18.0"
amap_map_fluttify:
dependency: "direct main"
description:
name: amap_map_fluttify
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.29.0"
amap_search_fluttify:
dependency: transitive
description:
name: amap_search_fluttify
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.14.0"
analyzer: analyzer:
dependency: transitive dependency: transitive
description: description:
@ -162,6 +190,13 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.1" version: "2.1.1"
core_location_fluttify:
dependency: transitive
description:
name: core_location_fluttify
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.4.1"
crypto: crypto:
dependency: transitive dependency: transitive
description: description:
@ -432,7 +467,7 @@ packages:
name: flutter_screenutil name: flutter_screenutil
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.3.1" version: "3.2.0"
flutter_slidable: flutter_slidable:
dependency: "direct main" dependency: "direct main"
description: description:
@ -485,6 +520,13 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "8.8.1" version: "8.8.1"
foundation_fluttify:
dependency: transitive
description:
name: foundation_fluttify
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.9.10+1"
glob: glob:
dependency: transitive dependency: transitive
description: description:

@ -47,7 +47,7 @@ dependencies:
flutter_redux: ^0.5.3 flutter_redux: ^0.5.3
provider: ^4.1.3 provider: ^4.1.3
# 屏幕适配 # 屏幕适配
flutter_screenutil: ^2.3.1 flutter_screenutil: ^3.2.0
cupertino_icons: ^0.1.3 cupertino_icons: ^0.1.3
# 打电话等各种功能 # 打电话等各种功能
url_launcher: 5.5.2 url_launcher: 5.5.2
@ -112,6 +112,9 @@ dependencies:
flutter_picker: ^1.1.5 flutter_picker: ^1.1.5
#加载动画 #加载动画
loading_animations: ^2.1.0 loading_animations: ^2.1.0
#高德地图
amap_map_fluttify:
amap_location_fluttify:
#用户存储路径 #用户存储路径
path_provider: ^1.6.18 path_provider: ^1.6.18

Loading…
Cancel
Save