Flutter权限请求管理插件permission_builder的使用

Flutter权限请求管理插件permission_builder的使用

permission_builder 是一个用于管理 Flutter 应用权限请求的插件。它基于 permission_handler 插件,并提供了以下功能:

  • 提供一组构建器(builders),可以根据权限状态渲染不同的小部件。
  • 提供函数来请求权限 (askPermission) 和打开设置页面 (openSettings)。
  • 使用 provider 进行权限状态管理,并通过 freezed 联合类型提供简洁的权限处理 API。

示例代码

以下是一个完整的示例,展示如何使用 permission_builder 来管理权限请求。

import 'package:flutter/material.dart';
import 'package:permission_builder/permission_builder.dart';

void main() {
  runApp(MyApp());
}

/// 主应用入口
class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MyHomePage();
  }
}

/// 默认页面
class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Permission Builder 示例'),
      ),
      body: ListView(
        children: [
          // 请求位置权限
          PermissionBuilder(
            permission: Permission.location,
            lazy: true,
            initialBuilder: (askPermissionFn) => ListTile(
              title: Text('获取位置权限'),
              subtitle: Text('我们尚未请求权限'),
              leading: IconButton(
                icon: Icon(Icons.gesture),
                onPressed: () async => await askPermissionFn(),
              ),
              trailing: Icon(Icons.check_box_outline_blank),
            ),
            requestingBuilder: (context) => ListTile(
              title: Text('请求权限中'),
              subtitle: Text('正在请求权限'),
              trailing: CircularProgressIndicator(),
            ),
            grantedBuilder: (context) => ListTile(
              title: Text('权限已授予'),
              trailing: Icon(
                Icons.check_box,
                color: Colors.green,
              ),
            ),
            restrictedBuilder: (askPermissionFn) => ListTile(
              title: Text('权限受限'),
              subtitle: Text('操作系统限制了访问,例如家长控制'),
              leading: IconButton(
                onPressed: () async => await askPermissionFn(),
                icon: Icon(Icons.gesture),
              ),
            ),
            permanentlyDeniedBuilder: (askPermissionFn, openSettingsFn) => ListTile(
              title: Text('权限永久拒绝'),
              subtitle: Text(
                  '用户选择不再显示权限请求对话框。唯一的方法是让用户手动在系统设置中启用权限。'),
              leading: IconButton(
                onPressed: () async => await askPermissionFn(),
                icon: Icon(Icons.gesture),
              ),
            ),
            deniedBuilder: (askPermissionFn, openSettingsFn) => ListTile(
              title: Text('权限被拒绝'),
              subtitle: Text('用户拒绝了该权限'),
              leading: IconButton(
                onPressed: () async => await askPermissionFn(),
                icon: Icon(Icons.gesture),
              ),
            ),
          ),
          // 请求相机权限
          PermissionBuilder(
            permission: Permission.camera,
            lazy: true,
            initialBuilder: (askPermissionFn) => ListTile(
              title: Text('获取相机权限'),
              subtitle: Text('我们尚未请求权限'),
              leading: IconButton(
                icon: Icon(Icons.gesture),
                onPressed: () async => await askPermissionFn(),
              ),
              trailing: Icon(Icons.check_box_outline_blank),
            ),
            requestingBuilder: (context) => ListTile(
              title: Text('请求权限中'),
              subtitle: Text('正在请求权限'),
              trailing: CircularProgressIndicator(),
            ),
            grantedBuilder: (context) => ListTile(
              title: Text('权限已授予'),
              trailing: Icon(
                Icons.check_box,
                color: Colors.green,
              ),
            ),
            restrictedBuilder: (askPermissionFn) => ListTile(
              title: Text('权限受限'),
              subtitle: Text('操作系统限制了访问,例如家长控制'),
              leading: IconButton(
                onPressed: () async => await askPermissionFn(),
                icon: Icon(Icons.gesture),
              ),
            ),
            permanentlyDeniedBuilder: (askPermissionFn, openSettingsFn) => ListTile(
              title: Text('权限永久拒绝'),
              subtitle: Text(
                  '用户选择不再显示权限请求对话框。唯一的方法是让用户手动在系统设置中启用权限。'),
              leading: IconButton(
                onPressed: () async => await askPermissionFn(),
                icon: Icon(Icons.gesture),
              ),
            ),
            deniedBuilder: (askPermissionFn, openSettingsFn) => ListTile(
              title: Text('权限被拒绝'),
              subtitle: Text('用户拒绝了该权限'),
              leading: IconButton(
                onPressed: () async => await askPermissionFn(),
                icon: Icon(Icons.gesture),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter权限请求管理插件permission_builder的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter权限请求管理插件permission_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


permission_builder 是一个用于 Flutter 的权限请求管理插件,它简化了权限请求的流程,并提供了更简洁的 API 来处理权限请求。通过 permission_builder,你可以轻松地请求权限并处理权限状态。

安装

首先,你需要在 pubspec.yaml 文件中添加 permission_builder 依赖:

dependencies:
  flutter:
    sdk: flutter
  permission_builder: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

基本用法

permission_builder 提供了一个 PermissionBuilder 小部件,它允许你在构建 UI 时请求权限。以下是一个简单的示例,展示了如何使用 permission_builder 请求相机权限:

import 'package:flutter/material.dart';
import 'package:permission_builder/permission_builder.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PermissionExample(),
    );
  }
}

class PermissionExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Permission Builder Example'),
      ),
      body: Center(
        child: PermissionBuilder(
          permission: Permission.camera,
          onGranted: () => Text('Camera permission granted!'),
          onDenied: () => Text('Camera permission denied.'),
          onPermanentlyDenied: () => Text('Camera permission permanently denied.'),
        ),
      ),
    );
  }
}

参数说明

  • permission: 需要请求的权限。例如 Permission.cameraPermission.location 等。
  • onGranted: 当权限被授予时显示的 Widget。
  • onDenied: 当权限被拒绝时显示的 Widget。
  • onPermanentlyDenied: 当权限被永久拒绝时显示的 Widget(用户选择了“不再询问”)。

手动请求权限

如果你不想使用 PermissionBuilder 小部件,你也可以手动请求权限:

import 'package:permission_builder/permission_builder.dart';

void requestCameraPermission() async {
  final status = await Permission.camera.request();
  if (status.isGranted) {
    print('Camera permission granted!');
  } else if (status.isDenied) {
    print('Camera permission denied.');
  } else if (status.isPermanentlyDenied) {
    print('Camera permission permanently denied.');
  }
}
回到顶部