@@ -45,6 +45,16 @@ class DisclosurePage extends StatefulWidget {
45
45
State <DisclosurePage > createState () => _DisclosurePageState ();
46
46
}
47
47
48
+ class _DisplayItem {
49
+ _DisplayItem ({
50
+ required this .config,
51
+ required this .isService,
52
+ });
53
+
54
+ final PermissionItemConfig config;
55
+ final bool isService;
56
+ }
57
+
48
58
class _DisclosurePageState extends State <DisclosurePage >
49
59
with
50
60
// ignore: prefer_mixin, WidgetsBindingObserver is Framework code
@@ -71,7 +81,7 @@ class _DisclosurePageState extends State<DisclosurePage>
71
81
super .dispose ();
72
82
}
73
83
74
- List <PermissionItemConfig > _getRequestingPermissions () =>
84
+ List <_DisplayItem > _getRequestingPermissions () =>
75
85
widget.permissionConfig.permissionItemConfigs.expand ((e) {
76
86
var denied = false ;
77
87
var requested = false ;
@@ -91,12 +101,12 @@ class _DisclosurePageState extends State<DisclosurePage>
91
101
}
92
102
final serviceText = e.serviceItemText;
93
103
94
- final List <PermissionItemConfig > result = [];
95
- if (serviceDisabled && serviceText != null ) {
96
- result.add (e );
104
+ final List <_DisplayItem > result = [];
105
+ if (serviceDisabled && serviceText != null && e. required ) {
106
+ result.add (_DisplayItem (config : e, isService : true ) );
97
107
}
98
108
if (denied && (! requested || e.required )) {
99
- result.add (e );
109
+ result.add (_DisplayItem (config : e, isService : false ) );
100
110
}
101
111
102
112
return result;
@@ -130,7 +140,8 @@ class _DisclosurePageState extends State<DisclosurePage>
130
140
return titleWidget;
131
141
} else {
132
142
final item = permissionItems[index - 1 ];
133
- var icon = item.itemText.icon;
143
+ final config = item.isService ? item.config.serviceItemText : item.config.itemText;
144
+ var icon = config? .icon;
134
145
icon ?? = Icon (
135
146
Icons .perm_device_info_sharp,
136
147
color: Theme .of (context).primaryColor,
@@ -148,7 +159,7 @@ class _DisclosurePageState extends State<DisclosurePage>
148
159
children: [
149
160
Flexible (
150
161
child: Text (
151
- item.itemText. header,
162
+ config ? . header ?? '' ,
152
163
style: Theme .of (context).textTheme.subtitle1,
153
164
softWrap: true ,
154
165
overflow: TextOverflow .ellipsis,
@@ -157,7 +168,7 @@ class _DisclosurePageState extends State<DisclosurePage>
157
168
),
158
169
Flexible (
159
170
child: Text (
160
- item.itemText. rationaleText,
171
+ config ? . rationaleText ?? '' ,
161
172
style: Theme .of (context).textTheme.bodyText2,
162
173
softWrap: true ,
163
174
overflow: TextOverflow .ellipsis,
@@ -193,52 +204,56 @@ class _DisclosurePageState extends State<DisclosurePage>
193
204
194
205
// Request permissions one by one because in some cases requesting
195
206
// multiple permissions does not ask the user as expected.
196
- for (final PermissionItemConfig permConfig in _getRequestingPermissions ()) {
197
- for (final Permission perm in permConfig.permissions) {
198
- if (permConfig.required && perm is PermissionWithService ) {
199
- final text = permConfig.serviceItemText;
200
- if (text != null ) {
201
- var serviceStatus = await widget._service.serviceStatus (perm);
202
- while (serviceStatus == ServiceStatus .disabled) {
203
- if (perm == Permission .phone) {
204
- await _showRequiredPermDialog (text, _showPhoneSettings);
205
- } else if (perm == Permission .location ||
206
- perm == Permission .locationAlways ||
207
- perm == Permission .locationWhenInUse) {
208
- await _showRequiredPermDialog (text, _showLocationSettings);
209
- } else {
210
- if (kDebugMode) {
211
- print (
212
- '[flutter-force-permission] WARN: Unsupported Permission with service $perm found.' ,
213
- );
207
+ for (final _DisplayItem item in _getRequestingPermissions ()) {
208
+ if (item.isService) {
209
+ final text = item.config.serviceItemText;
210
+ if (text != null ) {
211
+ for (final Permission perm in item.config.permissions) {
212
+ if (perm is PermissionWithService ) {
213
+ var serviceStatus = await widget._service.serviceStatus (perm);
214
+ while (serviceStatus == ServiceStatus .disabled) {
215
+ if (perm == Permission .phone) {
216
+ await _showRequiredPermDialog (text, _showPhoneSettings);
217
+ } else if (perm == Permission .location ||
218
+ perm == Permission .locationAlways ||
219
+ perm == Permission .locationWhenInUse) {
220
+ await _showRequiredPermDialog (text, _showLocationSettings);
221
+ } else {
222
+ if (kDebugMode) {
223
+ print (
224
+ '[flutter-force-permission] WARN: Unsupported Permission with service $perm found.' ,
225
+ );
226
+ }
227
+ break ;
214
228
}
215
- break ;
229
+ // ignore: avoid-ignoring-return-values, not needed.
230
+ await widget._resumed.stream.firstWhere ((element) => element);
231
+ serviceStatus = await widget._service.serviceStatus (perm);
216
232
}
233
+ }
234
+ }
235
+ }
236
+ } else {
237
+ for (final Permission perm in item.config.permissions) {
238
+ // ignore: avoid-ignoring-return-values, not needed.
239
+ await widget._service.request (perm);
240
+
241
+ if (item.config.required ) {
242
+ var permStatus = await widget._service.status (perm);
243
+ while (permStatus != PermissionStatus .granted) {
244
+ await _showRequiredPermDialog (
245
+ item.config.itemText,
246
+ _showAppSettings,
247
+ );
217
248
// ignore: avoid-ignoring-return-values, not needed.
218
249
await widget._resumed.stream.firstWhere ((element) => element);
219
- serviceStatus = await widget._service.serviceStatus (perm);
250
+ permStatus = await widget._service.status (perm);
220
251
}
221
252
}
222
- }
223
253
224
- // ignore: avoid-ignoring-return-values, not needed.
225
- await widget._service.request (perm);
226
-
227
- if (permConfig.required ) {
228
- var permStatus = await widget._service.status (perm);
229
- while (permStatus != PermissionStatus .granted) {
230
- await _showRequiredPermDialog (
231
- permConfig.itemText,
232
- _showAppSettings,
233
- );
234
- // ignore: avoid-ignoring-return-values, not needed.
235
- await widget._resumed.stream.firstWhere ((element) => element);
236
- permStatus = await widget._service.status (perm);
237
- }
254
+ // ignore: avoid-ignoring-return-values, not needed.
255
+ await prefs.setBool (getRequestedPrefKey (perm), true );
238
256
}
239
-
240
- // ignore: avoid-ignoring-return-values, not needed.
241
- await prefs.setBool (getRequestedPrefKey (perm), true );
242
257
}
243
258
}
244
259
0 commit comments