permission_request_widget.dart
5.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
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,
);
}
}