checkAndRequestPermissions function
Future<SunnyPermissionStatus>
checkAndRequestPermissions(
- BuildContext context, {
- required Permission permission,
- required LocalizedLabel title,
- LocalizedLabel? subtitle,
- bool preemptPermission = true,
- Widget? subtitleWidget,
Requests permission to pop the access dialog, then returns the final result... simplified down to granted, rejected, or later
Implementation
Future<SunnyPermissionStatus> checkAndRequestPermissions(
BuildContext context, {
required Permission permission,
required LocalizedLabel title,
LocalizedLabel? subtitle,
bool preemptPermission = true,
Widget? subtitleWidget,
}) async {
if (kIsWeb || infoX.isMacOS) return SunnyPermissionStatus.granted;
var intl = SunnyIntl.of(context);
final _subtitleWidget =
subtitleWidget ?? (subtitle != null ? Text(subtitle(intl)) : null);
final status = await permission.status;
_permissionChecks.add(PermissionInfo(permission, status));
if (status == PermissionStatus.granted ||
status == PermissionStatus.limited) {
return SunnyPermissionStatus.granted;
} else if ((status == PermissionStatus.denied)) {
// Show preliminary permission screen
final bool doitNow = preemptPermission == false ||
(await (showPlatformDialog<bool>(
context: context,
useRootNavigator: true,
builder: (context) {
return PlatformAlertDialog(
title: Text(title(intl)),
content: _subtitleWidget,
actions: [
PlatformDialogAction(
key: Key("permission-maybe-later-button"),
child: Text("Maybe Later"),
onPressed: () => Navigator.pop(context, false),
),
PlatformDialogAction(
key: Key("permission-yes-button"),
child: Text("Yes"),
cupertino: (context, _) =>
CupertinoDialogActionData(isDefaultAction: true),
onPressed: () => Navigator.pop(context, true),
)
],
);
},
))) ==
true;
if (doitNow) {
final permissions = await [permission].request();
final status = permissions[permission];
_permissionChecks.add(PermissionInfo(permission, status));
if (status == PermissionStatus.granted) {
return SunnyPermissionStatus.granted;
} else {
return SunnyPermissionStatus.rejected;
}
} else {
return SunnyPermissionStatus.later;
}
} else {
return SunnyPermissionStatus.rejected;
}
}