From 44f88ad34894f565ded7856d7848f37af1b37c6d Mon Sep 17 00:00:00 2001 From: zhaolong <928343994@qq.com> Date: Wed, 9 Dec 2020 18:19:21 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=BA=94=E8=AE=B2=20=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E6=9D=83=E9=99=90=E7=94=B3=E8=AF=B7=20=E5=B0=81?= =?UTF-8?q?=E8=A3=85=20=20iOS=E6=9D=83=E9=99=90=E7=94=B3=E8=AF=B7=E9=80=82?= =?UTF-8?q?=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/Runner/Info.plist | 4 + lib/src/index_page.dart | 141 ++++------------ .../common/perlmisson_request_widget.dart | 158 ++++++++++++++++++ 3 files changed, 193 insertions(+), 110 deletions(-) create mode 100644 lib/src/pages/common/perlmisson_request_widget.dart diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 05a8027..d933b0b 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -43,5 +43,9 @@ UIViewControllerBasedStatusBarAppearance + + NSCameraUsageDescription + APP需要访问您的相机权限 + diff --git a/lib/src/index_page.dart b/lib/src/index_page.dart index 7e1122c..e3bc3dc 100644 --- a/lib/src/index_page.dart +++ b/lib/src/index_page.dart @@ -3,6 +3,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'pages/common/perlmisson_request_widget.dart'; + /// 创建人: Created by zhaolong /// 创建时间:Created by on 2020/12/7. /// @@ -19,32 +21,38 @@ class IndexPage extends StatefulWidget { } } -class _IndexPageState extends State with WidgetsBindingObserver { - //页面的初始化函数 +class _IndexPageState extends State { + List _list = [ + "为您更好的体验应用,所以需要获取您的手机文件存储权限,以保存您的一些偏好设置", + "您已拒绝权限,所以无法保存您的一些偏好设置,将无法使用APP", + "您已拒绝权限,请在设置中心中同意APP的权限请求", + "其他错误" + ]; + @override void initState() { super.initState(); - - checkPermisson(); - - //注册观察者 - WidgetsBinding.instance.addObserver(this); - } - - @override - void didChangeAppLifecycleState(AppLifecycleState state) { - super.didChangeAppLifecycleState(state); - if (state == AppLifecycleState.resumed && _isGoSetting) { - checkPermisson(); - } - } - - @override - void dispose() { - //注销观察者 - WidgetsBinding.instance.removeObserver(this); - - super.dispose(); + Future.delayed(Duration.zero, () { + Navigator.of(context) + .push( + PageRouteBuilder( + opaque: false, + pageBuilder: (BuildContext context, Animation animation, + Animation secondaryAnimation) { + return PermissionRequestWidget( + permission: Permission.camera, + permissionList: _list, + ); + }), + ) + .then((value) { + if (value == null || !value) { + //权限请求不通过 + } else { + //权限请求通过 + } + }); + }); } @override @@ -59,91 +67,4 @@ class _IndexPageState extends State with WidgetsBindingObserver { ), ); } - - void checkPermisson({PermissionStatus status}) async { - //权限 - Permission permission = Permission.storage; - - if (status == null) { - //权限状态 - status = await permission.status; - } - - if (status.isUndetermined) { - //第一次申请 - showPermissonAlert(_list[0], "同意", permission); - } else if (status.isDenied) { - //用户第一次申请拒绝 - showPermissonAlert(_list[1], "重试", permission); - } else if (status.isPermanentlyDenied) { - //第二次申请 用户拒绝 - showPermissonAlert(_list[2], "去设置中心", permission, isSetting: true); - } else { - //通过 - } - } - - List _list = [ - "为您更好的体验应用,所以需要获取您的手机文件存储权限,以保存您的一些偏好设置", - "您已拒绝权限,所以无法保存您的一些偏好设置,将无法使用APP", - "您已拒绝权限,请在设置中心中同意APP的权限请求", - "其他错误" - ]; - - //是否去设置中心 - bool _isGoSetting = false; - - void showPermissonAlert( - String message, String rightString, Permission permission, - {bool isSetting = false}) { - showCupertinoDialog( - builder: (BuildContext context) { - return CupertinoAlertDialog( - title: Text("温馨提示"), - content: Container( - padding: EdgeInsets.all(12), - child: Text(message), - ), - actions: [ - //左边的按钮 - CupertinoDialogAction( - child: Text("退出应用"), - onPressed: () { - closeApp(); - }, - ), - //右边的按钮 - CupertinoDialogAction( - child: Text("$rightString"), - onPressed: () { - //关闭弹框 - Navigator.of(context).pop(); - if (isSetting) { - _isGoSetting = true; - //去设置中心 - openAppSettings(); - } else { - //申请权限 - requestPermiss(permission); - } - }, - ) - ], - ); - }, - context: context); - } - - void requestPermiss(Permission permission) async { - //发起权限申请 - PermissionStatus status = await permission.request(); - - //校验 - checkPermisson(); - } - - void closeApp() { - //关闭应用的方法 - SystemChannels.platform.invokeMethod("SystemNavigator.pop"); - } } diff --git a/lib/src/pages/common/perlmisson_request_widget.dart b/lib/src/pages/common/perlmisson_request_widget.dart new file mode 100644 index 0000000..fcbfcf7 --- /dev/null +++ b/lib/src/pages/common/perlmisson_request_widget.dart @@ -0,0 +1,158 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:permission_handler/permission_handler.dart'; + +/// 创建人: Created by zhaolong +/// 创建时间:Created by on 2020/12/9. +/// +/// 可关注公众号:我的大前端生涯 获取最新技术分享 +/// 可关注网易云课堂:https://study.163.com/instructor/1021406098.htm +/// 可关注博客:https://blog.csdn.net/zl18603543572 +/// +/// 代码清单 +///权限请求模版 +class PermissionRequestWidget extends StatefulWidget { + final Permission permission; + final List permissionList; + final bool isCloseApp; + final String leftButtonText; + + PermissionRequestWidget( + {@required this.permission, + @required this.permissionList, + this.leftButtonText = "再考虑一下", + this.isCloseApp = false}); + + @override + _PermissionRequestWidgetState createState() => + _PermissionRequestWidgetState(); +} + +class _PermissionRequestWidgetState extends State + with WidgetsBindingObserver { + //页面的初始化函数 + @override + void initState() { + super.initState(); + checkPermisson(); + //注册观察者 + WidgetsBinding.instance.addObserver(this); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + super.didChangeAppLifecycleState(state); + if (state == AppLifecycleState.resumed && _isGoSetting) { + checkPermisson(); + } + } + + void checkPermisson({PermissionStatus status}) async { + //权限 + Permission permission = widget.permission; + + if (status == null) { + //权限状态 + status = await permission.status; + } + + if (status.isUndetermined) { + //第一次申请 + showPermissonAlert(widget.permissionList[0], "同意", permission); + } else if (status.isDenied) { + if (Platform.isIOS) { + showPermissonAlert(widget.permissionList[2], "去设置中心", permission, + isSetting: true); + return; + } + //用户第一次申请拒绝 + showPermissonAlert(widget.permissionList[1], "重试", permission); + } else if (status.isPermanentlyDenied) { + //第二次申请 用户拒绝 + showPermissonAlert(widget.permissionList[2], "去设置中心", permission, + isSetting: true); + } else { + //通过 + Navigator.of(context).pop(true); + } + } + + //是否去设置中心 + bool _isGoSetting = false; + + void showPermissonAlert( + String message, String rightString, Permission permission, + {bool isSetting = false}) { + showCupertinoDialog( + builder: (BuildContext context) { + return CupertinoAlertDialog( + title: Text("温馨提示"), + content: Container( + padding: EdgeInsets.all(12), + child: Text(message), + ), + actions: [ + //左边的按钮 + CupertinoDialogAction( + child: Text("${widget.leftButtonText}"), + onPressed: () { + if (widget.isCloseApp) { + closeApp(); + } else { + Navigator.of(context).pop(false); + } + }, + ), + //右边的按钮 + CupertinoDialogAction( + child: Text("$rightString"), + onPressed: () { + //关闭弹框 + Navigator.of(context).pop(); + if (isSetting) { + _isGoSetting = true; + //去设置中心 + openAppSettings(); + } else { + //申请权限 + requestPermiss(permission); + } + }, + ) + ], + ); + }, + context: context); + } + + void requestPermiss(Permission permission) async { + //发起权限申请 + PermissionStatus status = await permission.request(); + + //校验 + checkPermisson(); + } + + void closeApp() { + //关闭应用的方法 + SystemChannels.platform.invokeMethod("SystemNavigator.pop"); + } + + @override + void dispose() { + //注销观察者 + WidgetsBinding.instance.removeObserver(this); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.transparent, + ); + } +}