Flutter 小知识,动态权限申请工具类

好几天没写博客了,但好像也没什么人看,我的博客纯粹是当做笔记来写的..这篇记录一下学到的新知识获取动态权限.

要保持希望在每天清晨太阳升起 – null

老规矩,先来看看今日完成的效果图:

效果图(1.1):

在这里插入图片描述

来看看我画的这个草稿图,一下子就明白喽:

在这里插入图片描述
分析:

当启动APP的时候,来申请权限
在这里插入图片描述
弹出申请权限的按钮,点击同意按钮调出系统的申请权限

我的是华为手机,调出来是这样的,如果允许,则权限申请,如果禁止
在这里插入图片描述

则重新提示一下,如果用户还点击重试(拒绝)
在这里插入图片描述

重新调取权限
在这里插入图片描述

如果用户还是点击禁止后不在提示,则让用户去应用市场手动开启权限
在这里插入图片描述

permission_handler插件

使用插件:

permission_handler: ^5.0.1+1

添加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没多久

完整代码

原创不易,您的点赞就是对我最大的支持,留下您的点赞吧~

在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

s10g

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值