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

hmxc
张萌 4 years ago
parent 1d38844e9d
commit fe4f94e209

@ -5,6 +5,8 @@
additional functionality it is fine to subclass or reimplement
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">
<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">
<!-- Specifies an Android theme to apply to this Activity as soon as
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
Flutter's first frame. -->
<meta-data android:name="io.flutter.embedding.android.SplashScreenDrawable" android:resource="@drawable/launch_background" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
@ -26,6 +29,18 @@
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data android:name="flutterEmbedding" android:value="2" />
</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" />
<!-- 打开相册选取图片 -->

@ -1,6 +1,7 @@
import 'dart:io';
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:flutter/material.dart';
import 'package:flutter/cupertino.dart';
@ -14,7 +15,9 @@ import 'package:oktoast/oktoast.dart';
import 'package:akuCommunity/routers/router_init.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
ARoute.init(true);
AmapLocation.instance.init(iosKey: 'ios key');
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_beautiful_popup/main.dart';
import 'package:akuCommunity/utils/screenutil.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class ExplainTemplate extends BeautifulPopupTemplate {
@ -14,7 +15,7 @@ class ExplainTemplate extends BeautifulPopupTemplate {
@override
Color get primaryColor => options.primaryColor ?? Color(0xff15c0ec);
@override
final maxWidth = Screenutil.length(400);
final maxWidth = 400.w;
@override
final maxHeight = Screenutil.length(617);
@override

@ -176,7 +176,7 @@ class _SignInPageState extends State<SignInPage> {
@override
Widget build(BuildContext context) {
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(
backgroundColor: Colors.white,
appBar: _appBar(),

@ -35,7 +35,7 @@ class _TabNavigatorState extends State<TabNavigator> {
@override
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);
//
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/cupertino.dart';
import 'package:akuCommunity/utils/screenutil.dart';
@ -195,8 +197,7 @@ class _TotalApplicationsPageState extends State<TotalApplicationsPage> {
context, PageName.goods_manage_page.toString());
break;
case '一键报警':
Navigator.pushNamed(
context, PageName.one_alarm_page.toString());
ARoute.push(context, AlarmPage());
break;
default:
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:fluro/fluro.dart';
import 'package:flutter/material.dart';
@ -168,6 +169,7 @@ enum PageName {
things_evaluate_page,
agreement_page,
privacy_page,
alarm_page,
}
class Bundle {
@ -368,4 +370,6 @@ final Map<PageName, PageBuilder> pageRoutes = {
PageBuilder(builder: (bundle) => ThingsCreatePage(bundle: bundle)),
PageName.things_evaluate_page:
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"
source: hosted
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:
dependency: transitive
description:
@ -162,6 +190,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
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:
dependency: transitive
description:
@ -432,7 +467,7 @@ packages:
name: flutter_screenutil
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.3.1"
version: "3.2.0"
flutter_slidable:
dependency: "direct main"
description:
@ -485,6 +520,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
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:
dependency: transitive
description:

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

Loading…
Cancel
Save