permission_request_widget.dart 5.05 KB
import 'dart:io';

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<String> permissionList;
  final bool isCloseApp;
  final String leftButtonText;

  const PermissionRequestWidget({
    Key? key,
    required this.permission,
    required this.permissionList,
    this.leftButtonText = "再考虑一下",
    this.isCloseApp = false,
  }) : super(key: key);

  @override
  _PermissionRequestWidgetState createState() =>
      _PermissionRequestWidgetState();
}

class _PermissionRequestWidgetState extends State<PermissionRequestWidget>
    with WidgetsBindingObserver {
  //页面的初始化函数
  @override
  void initState() {
    super.initState();
    checkPermission();
    //注册观察者
    if (WidgetsBinding.instance != null) {
      WidgetsBinding.instance.addObserver(this);
    }
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    if (state == AppLifecycleState.resumed && _isGoSetting) {
      checkPermission();
    }
  }

  ///[PermissionStatus.denied] 用户拒绝访问所请求的特性
  ///[PermissionStatus.granted] 用户被授予对所请求特性的访问权。
  ///[PermissionStatus.restricted] iOS 平台 用户拒绝这个权限
  ///[PermissionStatus.limited] 用户已授权此应用程序进行有限访问。
  ///[PermissionStatus.permanentlyDenied] 被永久拒绝
  void checkPermission({PermissionStatus? status}) async {
    //权限
    Permission permission = widget.permission;

    status ??= await permission.status;
    if (status.isGranted) {
      Navigator.of(context).pop(true);
      return;
    }
    if (!status.isLimited) {
      //第一次申请
      showPermissionAlert(widget.permissionList[0], "同意", permission);
    } else if (status.isDenied) {
      if (Platform.isIOS) {
        showPermissionAlert(widget.permissionList[2], "去设置中心", permission,
            isSetting: true);
        return;
      }
      //用户第一次申请拒绝
      showPermissionAlert(widget.permissionList[1], "重试", permission);
    } else if (status.isPermanentlyDenied) {
      //第二次申请 用户拒绝
      showPermissionAlert(widget.permissionList[2], "去设置中心", permission,
          isSetting: true);
    } else {
      //通过
      Navigator.of(context).pop(true);
    }
  }

  //是否去设置中心
  bool _isGoSetting = false;

  void showPermissionAlert(
    String message,
    String rightString,
    Permission permission, {
    bool isSetting = false,
  }) {
    showDialog(
        builder: (BuildContext context) {
          return AlertDialog(
            title: const Text("温馨提示"),
            content: Container(
              padding: const EdgeInsets.all(12),
              child: Text(message),
            ),
            actions: [
              //左边的按钮
              TextButton(
                child: Text(widget.leftButtonText),
                onPressed: () {
                  if (widget.isCloseApp) {
                    closeApp();
                  } else {
                    Navigator.of(context).pop(false);
                  }
                },
              ),
              //右边的按钮
              TextButton(
                child: Text(rightString),
                onPressed: () {
                  //关闭弹框
                  Navigator.of(context).pop();
                  if (isSetting) {
                    _isGoSetting = true;
                    //去设置中心
                    openAppSettings();
                  } else {
                    //申请权限
                    requestPermission(permission);
                  }
                },
              )
            ],
          );
        },
        context: context);
  }

  void requestPermission(Permission permission) async {
    //发起权限申请
    PermissionStatus status = await permission.request();
    //校验
    checkPermission();
  }

  /// TODO 暂未使用
  void requestPermissionList(List<Permission> list) async {
    //多个权限申请
    Map<Permission, PermissionStatus> statuses = await [
      Permission.location,
      Permission.storage,
    ].request();
  }

  void closeApp() {
    //关闭应用的方法
    SystemChannels.platform.invokeMethod("SystemNavigator.pop");
  }

  @override
  void dispose() {
    //注销观察者
    if (WidgetsBinding.instance != null) {
      WidgetsBinding.instance.removeObserver(this);
    }

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return const Scaffold(
      backgroundColor: Colors.transparent,
    );
  }
}