checkAndRequestPermissions function

Future<SunnyPermissionStatus> checkAndRequestPermissions(
  1. BuildContext context, {
  2. required Permission permission,
  3. required LocalizedLabel title,
  4. LocalizedLabel? subtitle,
  5. bool preemptPermission = true,
  6. 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;
  }
}