好几天没写博客了,但好像也没什么人看,我的博客纯粹是当做笔记来写的..这篇记录一下学到的新知识获取动态权限.
要保持希望在每天清晨太阳升起 – null
老规矩,先来看看今日完成的效果图:
效果图(1.1)
:
来看看我画的这个草稿图,一下子就明白喽:
分析:
当启动APP的时候,来申请权限
弹出申请权限的按钮,点击同意按钮调出系统的申请权限
我的是华为手机,调出来是这样的,如果允许,则权限申请,如果禁止
则重新提示一下,如果用户还点击重试(拒绝)
重新调取权限
如果用户还是点击禁止后不在提示,则让用户去应用市场手动开启权限
permission_handler插件
使用插件:
添加Android权限
在AndroidManifest.xml中添加权限;
<!-- 外部存储权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Flutter代码
直接给大家看完整代码了:
完整代码:
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:permission_handler/permission_handler.dart';
/**
* @ClassName ${NAME}
* 作者: szj
* 时间: ${DATE} ${TIME}
* CSDN:https://blog.csdn.net/weixin_44819566
* 公众号:码上变有钱
*/
class PermissionUtil {
PermissionUtil(this._context);
List<String> _list = [
"为了更好地应用体验,请确定权限",
"您第一次拒绝权限,请确定权限",
"您第二次拒绝权限,请去应用市场开启权限"
];
BuildContext _context ;
void checkPermission({PermissionStatus status}) async {
//申请权限 permission_handler: ^5.0.1+1
//外部存储权限
Permission permission = Permission.storage;
if (status == null) {
///权限状态
status = await permission.status;
}
if (status.isUndetermined) {
//第一次申请
showPermissionDialog(_list[0], "同意", permission);
} else if (status.isDenied) {
//第一次申请拒绝
showPermissionDialog(_list[1], "重试", permission);
} else if (status.isPermanentlyDenied) {
//第二次申请
showPermissionDialog(_list[2], "去应用市场", permission,isUndetermined: true);
} else {
//通过
}
}
///是否去设置中心
bool isGoAppSetteng = false;
///msg 提示文案
///rightMsg 右侧按钮显示文案
///要申请的权限
/// isUndetermined 可选参数,传入的是当前是否去设置中心
void showPermissionDialog(
String msg, String rightMsg, Permission permission,{bool isUndetermined = false}) {
//使用苹果的dialog
showCupertinoDialog(
builder: (BuildContext context) {
return CupertinoAlertDialog(
title: Text("温馨提示"),
content: Container(
child: Text(msg),
),
actions: [
//左边按钮
CupertinoDialogAction(
child: Text("关闭应用"),
onPressed: (){
//关闭引用
closeAPP();
},
),
//右边
CupertinoDialogAction(
child: Text(rightMsg),
onPressed: () {
//关闭弹框
Navigator.pop(context);
if(isUndetermined){
isGoAppSetteng = true;
//去设置中心
openAppSettings();
}else{
//申请权限
isGoAppSetteng = false;
requestPermission(context,permission);
}
},
),
],
);
},
context: _context);
}
void requestPermission(BuildContext context,Permission permission) async {
//请求权限
PermissionStatus status = await permission.request();
//校验
checkPermission(status: status);
}
//关闭应用
void closeAPP() {
SystemChannels.platform.invokeMethod("SystemNavigator.pop");
}
}
使用:
在initState初始初始化时调用即可
@override
class _MainPageState extends State<MainPage> with WidgetsBindingObserver {
void initState() {
super.initState();
//用来观察应用切换状态
WidgetsBinding.instance.addObserver(this);
_permissionUtil = new PermissionUtil(context);
//请求权限
_permissionUtil.checkPermission();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
// TODO: implement didChangeAppLifecycleState
super.didChangeAppLifecycleState(state);
//当引用程序返回,并且当前是去的应用市场,则重新调用权限检测判断
if(state == AppLifecycleState.resumed && _permissionUtil.isGoAppSetteng){
_permissionUtil.checkPermission();
}
}
@override
void dispose() {
//注销观察者模式
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
}
解释:
使用是直接调用checkPermission即可;
_permissionUtil = new PermissionUtil(context);
//请求权限
_permissionUtil.checkPermission();
注意:
这里使用观察者模式是为了监听当从应用市场返回APP时,权限是否选中,
如果未选中,则在弹出去应用市场的弹框;
通过在didChangeAppLifecycleState()中判断,如果你对APP引用声明周期不熟悉可以查看Flutter Widget生命周期以及应用周期(1.6)
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
// TODO: implement didChangeAppLifecycleState
super.didChangeAppLifecycleState(state);
//当引用程序返回,并且当前是去的应用市场,则重新调用权限检测判断
if(state == AppLifecycleState.resumed && _permissionUtil.isGoAppSetteng){
_permissionUtil.checkPermission();
}
}
本章只是以外部存储权限来举例的
建议大家别直接复制,虽然这些代码很固定,但是也建议大家自己手动写一遍,这个工具类就是我模仿着别的大佬写的.我也是自学flutter没多久
原创不易,您的点赞就是对我最大的支持,留下您的点赞吧~