permission_settings_dialog.dart
1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import 'package:app_settings/app_settings.dart';
import 'package:flutter/material.dart';
import 'permission_dialog_shell.dart';
/// 权限被永久拒绝后的「去设置」引导弹窗
///
/// 与首次使用的用途说明弹窗共用样式骨架,
/// 差异在于文案面向「已拒绝」场景,主按钮直接跳转系统应用设置页。
class PermissionSettingsDialog extends StatelessWidget {
const PermissionSettingsDialog({super.key, required this.permission});
/// 权限名称,兼容「相机」与「相机权限」两种写法
final String permission;
/// 各权限被拒绝后的引导说明
static const Map<String, String> _descriptions = {
'相机': '未开启相机权限,无法拍摄。您可以在"设置"中开启后重试。',
'相册': '未开启相册权限,无法选择图片。您可以在"设置"中开启后重试。',
'麦克风': '未开启麦克风权限,无法录音评测。您可以在"设置"中开启后重试。',
};
static const String _fallbackDescription = '未开启对应权限,无法使用相关功能。您可以在"设置"中开启后重试。';
@override
Widget build(BuildContext context) {
final name = normalizePermissionName(permission);
return PermissionDialogShell(
title: permissionDialogTitle(permission),
description: _descriptions[name] ?? _fallbackDescription,
primaryText: '去设置',
onPrimary: () {
Navigator.of(context).pop();
// 引导用户到系统应用设置页面手动开启权限
AppSettings.openAppSettings(asAnotherTask: true);
},
secondaryText: '取消',
onSecondary: () => Navigator.of(context).pop(),
);
}
}
/// 展示权限被永久拒绝后的「去设置」引导弹窗
Future<void> showPermissionSettingsDialog(BuildContext context, String permission) {
return showDialog<void>(
context: context,
builder: (BuildContext context) => PermissionSettingsDialog(permission: permission),
);
}