@@ -45,27 +45,14 @@ class DisclosurePage extends StatefulWidget {
45
45
State <DisclosurePage > createState () => _DisclosurePageState ();
46
46
}
47
47
48
- @immutable
49
- class _PermissionItem {
50
- const _PermissionItem (this .permission, this .itemText);
51
-
52
- final Permission permission;
53
- final PermissionItemText itemText;
54
-
55
- @override
56
- bool operator == (Object other) =>
57
- identical (this , other) ||
58
- other is _PermissionItem &&
59
- runtimeType == other.runtimeType &&
60
- permission == other.permission &&
61
- itemText == other.itemText;
62
-
63
- @override
64
- int get hashCode => permission.hashCode ^ itemText.hashCode;
65
-
66
- @override
67
- String toString () =>
68
- '_PermissionItem{permission: $permission , itemText: $itemText }' ;
48
+ class _DisplayItem {
49
+ _DisplayItem ({
50
+ required this .config,
51
+ required this .isService,
52
+ });
53
+
54
+ final PermissionItemConfig config;
55
+ final bool isService;
69
56
}
70
57
71
58
class _DisclosurePageState extends State <DisclosurePage >
@@ -94,6 +81,37 @@ class _DisclosurePageState extends State<DisclosurePage>
94
81
super .dispose ();
95
82
}
96
83
84
+ List <_DisplayItem > _getRequestingPermissions () =>
85
+ widget.permissionConfig.permissionItemConfigs.expand ((e) {
86
+ var denied = false ;
87
+ var requested = false ;
88
+ var serviceDisabled = false ;
89
+ for (final Permission p in e.permissions) {
90
+ if (widget.permissionStatuses[p]? .status !=
91
+ PermissionStatus .granted) {
92
+ denied = true ;
93
+ }
94
+ if (widget.permissionStatuses[p]? .requested ?? true ) {
95
+ requested = true ;
96
+ }
97
+ if (widget.permissionStatuses[p]? .serviceStatus ==
98
+ ServiceStatus .disabled) {
99
+ serviceDisabled = true ;
100
+ }
101
+ }
102
+ final serviceText = e.serviceItemText;
103
+
104
+ final List <_DisplayItem > result = [];
105
+ if (serviceDisabled && serviceText != null && e.required ) {
106
+ result.add (_DisplayItem (config: e, isService: true ));
107
+ }
108
+ if (denied && (! requested || e.required )) {
109
+ result.add (_DisplayItem (config: e, isService: false ));
110
+ }
111
+
112
+ return result;
113
+ }).toList ();
114
+
97
115
@override
98
116
Widget build (BuildContext context) {
99
117
final titleWidget = Column (
@@ -107,37 +125,7 @@ class _DisclosurePageState extends State<DisclosurePage>
107
125
],
108
126
);
109
127
110
- final permissionItems =
111
- widget.permissionConfig.permissionItemConfigs.expand ((e) {
112
- var denied = false ;
113
- var requested = false ;
114
- var serviceDisabled = false ;
115
- for (final Permission p in e.permissions) {
116
- if (widget.permissionStatuses[p]? .status != PermissionStatus .granted) {
117
- denied = true ;
118
- }
119
- if (widget.permissionStatuses[p]? .requested ?? true ) {
120
- requested = true ;
121
- }
122
- if (widget.permissionStatuses[p]? .serviceStatus ==
123
- ServiceStatus .disabled) {
124
- serviceDisabled = true ;
125
- }
126
- }
127
- final itemText = e.itemText;
128
- final serviceText = e.serviceItemText;
129
- final permission = e.permissions.first;
130
-
131
- final List <_PermissionItem > result = [];
132
- if (serviceDisabled && serviceText != null ) {
133
- result.add (_PermissionItem (permission, serviceText));
134
- }
135
- if (denied && ! requested) {
136
- result.add (_PermissionItem (permission, itemText));
137
- }
138
-
139
- return result;
140
- }).toList ();
128
+ final permissionItems = _getRequestingPermissions ();
141
129
142
130
return Scaffold (
143
131
body: Column (
@@ -152,7 +140,10 @@ class _DisclosurePageState extends State<DisclosurePage>
152
140
return titleWidget;
153
141
} else {
154
142
final item = permissionItems[index - 1 ];
155
- var icon = item.itemText.icon;
143
+ final config = item.isService
144
+ ? item.config.serviceItemText
145
+ : item.config.itemText;
146
+ var icon = config? .icon;
156
147
icon ?? = Icon (
157
148
Icons .perm_device_info_sharp,
158
149
color: Theme .of (context).primaryColor,
@@ -170,7 +161,7 @@ class _DisclosurePageState extends State<DisclosurePage>
170
161
children: [
171
162
Flexible (
172
163
child: Text (
173
- item.itemText. header,
164
+ config ? . header ?? '' ,
174
165
style: Theme .of (context).textTheme.subtitle1,
175
166
softWrap: true ,
176
167
overflow: TextOverflow .ellipsis,
@@ -179,7 +170,7 @@ class _DisclosurePageState extends State<DisclosurePage>
179
170
),
180
171
Flexible (
181
172
child: Text (
182
- item.itemText. rationaleText,
173
+ config ? . rationaleText ?? '' ,
183
174
style: Theme .of (context).textTheme.bodyText2,
184
175
softWrap: true ,
185
176
overflow: TextOverflow .ellipsis,
@@ -215,53 +206,56 @@ class _DisclosurePageState extends State<DisclosurePage>
215
206
216
207
// Request permissions one by one because in some cases requesting
217
208
// multiple permissions does not ask the user as expected.
218
- for (final PermissionItemConfig permConfig
219
- in widget.permissionConfig.permissionItemConfigs) {
220
- for (final Permission perm in permConfig.permissions) {
221
- if (permConfig.required && perm is PermissionWithService ) {
222
- final text = permConfig.serviceItemText;
223
- if (text != null ) {
224
- var serviceStatus = await widget._service.serviceStatus (perm);
225
- while (serviceStatus == ServiceStatus .disabled) {
226
- if (perm == Permission .phone) {
227
- await _showRequiredPermDialog (text, _showPhoneSettings);
228
- } else if (perm == Permission .location ||
229
- perm == Permission .locationAlways ||
230
- perm == Permission .locationWhenInUse) {
231
- await _showRequiredPermDialog (text, _showLocationSettings);
232
- } else {
233
- if (kDebugMode) {
234
- print (
235
- '[flutter-force-permission] WARN: Unsupported Permission with service $perm found.' ,
236
- );
209
+ for (final _DisplayItem item in _getRequestingPermissions ()) {
210
+ if (item.isService) {
211
+ final text = item.config.serviceItemText;
212
+ if (text != null ) {
213
+ for (final Permission perm in item.config.permissions) {
214
+ if (perm is PermissionWithService ) {
215
+ var serviceStatus = await widget._service.serviceStatus (perm);
216
+ while (serviceStatus == ServiceStatus .disabled) {
217
+ if (perm == Permission .phone) {
218
+ await _showRequiredPermDialog (text, _showPhoneSettings);
219
+ } else if (perm == Permission .location ||
220
+ perm == Permission .locationAlways ||
221
+ perm == Permission .locationWhenInUse) {
222
+ await _showRequiredPermDialog (text, _showLocationSettings);
223
+ } else {
224
+ if (kDebugMode) {
225
+ print (
226
+ '[flutter-force-permission] WARN: Unsupported Permission with service $perm found.' ,
227
+ );
228
+ }
229
+ break ;
237
230
}
238
- break ;
231
+ // ignore: avoid-ignoring-return-values, not needed.
232
+ await widget._resumed.stream.firstWhere ((element) => element);
233
+ serviceStatus = await widget._service.serviceStatus (perm);
239
234
}
235
+ }
236
+ }
237
+ }
238
+ } else {
239
+ for (final Permission perm in item.config.permissions) {
240
+ // ignore: avoid-ignoring-return-values, not needed.
241
+ await widget._service.request (perm);
242
+
243
+ if (item.config.required ) {
244
+ var permStatus = await widget._service.status (perm);
245
+ while (permStatus != PermissionStatus .granted) {
246
+ await _showRequiredPermDialog (
247
+ item.config.itemText,
248
+ _showAppSettings,
249
+ );
240
250
// ignore: avoid-ignoring-return-values, not needed.
241
251
await widget._resumed.stream.firstWhere ((element) => element);
242
- serviceStatus = await widget._service.serviceStatus (perm);
252
+ permStatus = await widget._service.status (perm);
243
253
}
244
254
}
245
- }
246
255
247
- // ignore: avoid-ignoring-return-values, not needed.
248
- await widget._service.request (perm);
249
-
250
- if (permConfig.required ) {
251
- var permStatus = await widget._service.status (perm);
252
- while (permStatus != PermissionStatus .granted) {
253
- await _showRequiredPermDialog (
254
- permConfig.itemText,
255
- _showAppSettings,
256
- );
257
- // ignore: avoid-ignoring-return-values, not needed.
258
- await widget._resumed.stream.firstWhere ((element) => element);
259
- permStatus = await widget._service.status (perm);
260
- }
256
+ // ignore: avoid-ignoring-return-values, not needed.
257
+ await prefs.setBool (getRequestedPrefKey (perm), true );
261
258
}
262
-
263
- // ignore: avoid-ignoring-return-values, not needed.
264
- await prefs.setBool (getRequestedPrefKey (perm), true );
265
259
}
266
260
}
267
261
0 commit comments