permission_intro_dialog.dart
2.07 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
import 'package:flutter/material.dart';
import 'permission_dialog_shell.dart';
/// 首次使用某权限前的用途说明弹窗
///
/// 返回 `true` 表示用户点击「继续」,可以继续进行权限申请与后续业务;
/// 返回 `false` 表示用户点击「暂不开启」或点击遮罩关闭。
class PermissionIntroDialog extends StatelessWidget {
const PermissionIntroDialog({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$name。',
primaryText: '继续',
onPrimary: () => Navigator.of(context).pop(true),
secondaryText: '暂不开启',
onSecondary: () => Navigator.of(context).pop(false),
);
}
}
/// 展示首次使用权限前的用途说明弹窗
///
/// 返回 `true` 表示用户同意继续。
Future<bool> showPermissionIntroDialog(BuildContext context, String permission) async {
final result = await showDialog<bool>(
context: context,
builder: (BuildContext context) => PermissionIntroDialog(permission: permission),
);
return result == true;
}