美文网首页
权限处理

权限处理

作者: Crassus | 来源:发表于2023-09-04 14:32 被阅读0次
    import 'package:flutter/material.dart';
    import 'package:permission_handler/permission_handler.dart';
    
    class PermissionHelper {
      static VoidCallback defaultCall = () {};
    
      ///检查权限
      static void check(List<Permission> permissionList,
          {String? errMsg,
          VoidCallback? onSuccess,
          VoidCallback? onFailed,
          VoidCallback? onOpenSetting}) async {
        bool flag = true;
        for (var value in permissionList) {
          var status = await value.status;
          if (!status.isGranted) {
            flag = false;
            break;
          }
        }
        if (!flag) {
          PermissionStatus permissionStatus =
              await requestPermission(permissionList);
          if (permissionStatus.isGranted) {
            onSuccess != null ? onSuccess() : defaultCall();
          } else if (permissionStatus.isDenied) {
            onFailed != null ? onFailed() : defaultCall();
          } else if (permissionStatus.isPermanentlyDenied) {
            onOpenSetting != null ? onOpenSetting() : defaultCall();
          } else if (permissionStatus.isRestricted) {
            //IOS单独处理
            onOpenSetting != null ? onOpenSetting() : defaultCall();
          } else if (permissionStatus.isLimited) {
            //IOS单独处理
            onOpenSetting != null ? onOpenSetting() : defaultCall();
          }
        }else{
          onSuccess != null ? onSuccess() : defaultCall();
        }
      }
    
      //申请权限
      static Future<PermissionStatus> requestPermission(
          List<Permission> permissionList) async {
        Map<Permission, PermissionStatus> statuses = await permissionList.request();
        PermissionStatus currentPermissionStatus = PermissionStatus.granted;
        statuses.forEach((key, value) {
          if (!value.isGranted) {
            currentPermissionStatus = value;
            return;
          }
        });
        return currentPermissionStatus;
      }
    
      static checkPermission(List<Permission> requests,
          Function(bool)? successCallback, BuildContext context) {
        PermissionHelper.check(
          requests,
          onSuccess: () {
            // 权限已授予,执行成功逻辑
            successCallback?.call(true);
          },
          onFailed: () {
            requestAgainAlert(context, callback: () async {
              // 权限未授予,执行失败逻辑
              PermissionStatus status = await requestPermission(requests);
              successCallback?.call(status.isGranted);
            });
          },
          onOpenSetting: () {
            requestAgainAlert(context, callback: () {
              // 权限未授予,执行失败逻辑
              openAppSettings();
            });
          },
        );
      }
    
      static requestAgainAlert(BuildContext context, {Function()? callback}) {
        showDialog(
          context: context,
          builder: (BuildContext context) {
            return AlertDialog(
              title: const Text('权限未授予'),
              content: const Text('您需要授予"定位权限"才能继续使用该功能。'),
              actions: [
                TextButton(
                  onPressed: () {
                    callback?.call();
                    Navigator.of(context).pop();
                  },
                  child: const Text('确定'),
                ),
              ],
            );
          },
        );
      }
    }
    
    

    使用

     @override
      void initState() {
        super.initState();
        WidgetsBinding.instance.addObserver(this);
        requestLocationPermission();
      }
    
    
     Future<void> requestLocationPermission() async {
        await Future.delayed(Duration.zero); // 延迟到下一帧
        final requests = [Permission.locationWhenInUse];
        // ignore: use_build_context_synchronously
        PermissionHelper.checkPermission(requests, successCallback, context);
      }
    
    // 处理权限申请结果业务
    successCallback(bool success) async {
        if (success == false) {
          print("error $success");
          requestLocationPermission();
          return;
        }
    

    相关文章

      网友评论

          本文标题:权限处理

          本文链接:https://www.haomeiwen.com/subject/kvqcvdtx.html