permission_intro_dialog.dart 2.07 KB
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;
}