Skip to content

Commit 5da3bf9

Browse files
committed
fix requesting permissions may request requested permissions
1 parent 50d443b commit 5da3bf9

File tree

1 file changed

+35
-58
lines changed

1 file changed

+35
-58
lines changed

lib/src/views/disclosure_page.dart

Lines changed: 35 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -45,29 +45,6 @@ class DisclosurePage extends StatefulWidget {
4545
State<DisclosurePage> createState() => _DisclosurePageState();
4646
}
4747

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}';
69-
}
70-
7148
class _DisclosurePageState extends State<DisclosurePage>
7249
with
7350
// ignore: prefer_mixin, WidgetsBindingObserver is Framework code
@@ -94,6 +71,37 @@ class _DisclosurePageState extends State<DisclosurePage>
9471
super.dispose();
9572
}
9673

74+
List<PermissionItemConfig> _getRequestingPermissions() =>
75+
widget.permissionConfig.permissionItemConfigs.expand((e) {
76+
var denied = false;
77+
var requested = false;
78+
var serviceDisabled = false;
79+
for (final Permission p in e.permissions) {
80+
if (widget.permissionStatuses[p]?.status !=
81+
PermissionStatus.granted) {
82+
denied = true;
83+
}
84+
if (widget.permissionStatuses[p]?.requested ?? true) {
85+
requested = true;
86+
}
87+
if (widget.permissionStatuses[p]?.serviceStatus ==
88+
ServiceStatus.disabled) {
89+
serviceDisabled = true;
90+
}
91+
}
92+
final serviceText = e.serviceItemText;
93+
94+
final List<PermissionItemConfig> result = [];
95+
if (serviceDisabled && serviceText != null) {
96+
result.add(e);
97+
}
98+
if (denied && (!requested || e.required)) {
99+
result.add(e);
100+
}
101+
102+
return result;
103+
}).toList();
104+
97105
@override
98106
Widget build(BuildContext context) {
99107
final titleWidget = Column(
@@ -107,37 +115,7 @@ class _DisclosurePageState extends State<DisclosurePage>
107115
],
108116
);
109117

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 || e.required)) {
136-
result.add(_PermissionItem(permission, itemText));
137-
}
138-
139-
return result;
140-
}).toList();
118+
final permissionItems = _getRequestingPermissions();
141119

142120
return Scaffold(
143121
body: Column(
@@ -215,8 +193,7 @@ class _DisclosurePageState extends State<DisclosurePage>
215193

216194
// Request permissions one by one because in some cases requesting
217195
// multiple permissions does not ask the user as expected.
218-
for (final PermissionItemConfig permConfig
219-
in widget.permissionConfig.permissionItemConfigs) {
196+
for (final PermissionItemConfig permConfig in _getRequestingPermissions()) {
220197
for (final Permission perm in permConfig.permissions) {
221198
if (permConfig.required && perm is PermissionWithService) {
222199
final text = permConfig.serviceItemText;
@@ -263,9 +240,9 @@ class _DisclosurePageState extends State<DisclosurePage>
263240
// ignore: avoid-ignoring-return-values, not needed.
264241
await prefs.setBool(getRequestedPrefKey(perm), true);
265242
}
266-
}
267243

268-
navigator.pop();
244+
navigator.pop();
245+
}
269246
}
270247

271248
Future<void> _showRequiredPermDialog(

0 commit comments

Comments
 (0)