@@ -45,6 +45,16 @@ class DisclosurePage extends StatefulWidget {
4545 State <DisclosurePage > createState () => _DisclosurePageState ();
4646}
4747
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+
4858class _DisclosurePageState extends State <DisclosurePage >
4959 with
5060 // ignore: prefer_mixin, WidgetsBindingObserver is Framework code
@@ -71,7 +81,7 @@ class _DisclosurePageState extends State<DisclosurePage>
7181 super .dispose ();
7282 }
7383
74- List <PermissionItemConfig > _getRequestingPermissions () =>
84+ List <_DisplayItem > _getRequestingPermissions () =>
7585 widget.permissionConfig.permissionItemConfigs.expand ((e) {
7686 var denied = false ;
7787 var requested = false ;
@@ -91,12 +101,12 @@ class _DisclosurePageState extends State<DisclosurePage>
91101 }
92102 final serviceText = e.serviceItemText;
93103
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 ) );
97107 }
98108 if (denied && (! requested || e.required )) {
99- result.add (e );
109+ result.add (_DisplayItem (config : e, isService : false ) );
100110 }
101111
102112 return result;
@@ -130,7 +140,8 @@ class _DisclosurePageState extends State<DisclosurePage>
130140 return titleWidget;
131141 } else {
132142 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;
134145 icon ?? = Icon (
135146 Icons .perm_device_info_sharp,
136147 color: Theme .of (context).primaryColor,
@@ -148,7 +159,7 @@ class _DisclosurePageState extends State<DisclosurePage>
148159 children: [
149160 Flexible (
150161 child: Text (
151- item.itemText. header,
162+ config ? . header ?? '' ,
152163 style: Theme .of (context).textTheme.subtitle1,
153164 softWrap: true ,
154165 overflow: TextOverflow .ellipsis,
@@ -157,7 +168,7 @@ class _DisclosurePageState extends State<DisclosurePage>
157168 ),
158169 Flexible (
159170 child: Text (
160- item.itemText. rationaleText,
171+ config ? . rationaleText ?? '' ,
161172 style: Theme .of (context).textTheme.bodyText2,
162173 softWrap: true ,
163174 overflow: TextOverflow .ellipsis,
@@ -193,52 +204,56 @@ class _DisclosurePageState extends State<DisclosurePage>
193204
194205 // Request permissions one by one because in some cases requesting
195206 // 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 ;
214228 }
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);
216232 }
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+ );
217248 // ignore: avoid-ignoring-return-values, not needed.
218249 await widget._resumed.stream.firstWhere ((element) => element);
219- serviceStatus = await widget._service.serviceStatus (perm);
250+ permStatus = await widget._service.status (perm);
220251 }
221252 }
222- }
223253
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 );
238256 }
239-
240- // ignore: avoid-ignoring-return-values, not needed.
241- await prefs.setBool (getRequestedPrefKey (perm), true );
242257 }
243258 }
244259
0 commit comments