0
0
FlutterHow-ToBeginner · 4 min read

How to Use permission_handler in Flutter for App Permissions

Use the permission_handler package in Flutter to request and check permissions by importing it, then calling Permission.xyz.request() or Permission.xyz.status. This package simplifies handling permissions like camera, location, and storage with easy-to-use methods.
📐

Syntax

The permission_handler package provides a simple API to check and request permissions. You import the package, then use Permission.permissionName.status to check permission status, and Permission.permissionName.request() to ask the user for permission.

Example permissions include Permission.camera, Permission.location, and Permission.storage.

dart
import 'package:permission_handler/permission_handler.dart';

Future<void> checkAndRequestPermission() async {
  var status = await Permission.camera.status;
  if (!status.isGranted) {
    var result = await Permission.camera.request();
    if (result.isGranted) {
      // Permission granted
    }
  }
}
💻

Example

This example shows a Flutter app that requests camera permission when a button is pressed and displays the permission status on screen.

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

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _status = 'Unknown';

  Future<void> _requestCameraPermission() async {
    var status = await Permission.camera.status;
    if (!status.isGranted) {
      status = await Permission.camera.request();
    }
    setState(() {
      _status = status.isGranted ? 'Camera Permission Granted' : 'Camera Permission Denied';
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Permission Handler Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(_status),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _requestCameraPermission,
                child: Text('Request Camera Permission'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
Output
App screen with a button labeled 'Request Camera Permission' and text showing 'Unknown' initially. After pressing the button, text updates to 'Camera Permission Granted' or 'Camera Permission Denied' based on user response.
⚠️

Common Pitfalls

  • Forgetting to add required permissions in platform-specific files like AndroidManifest.xml or Info.plist.
  • Not handling the case when the user permanently denies permission (requires directing them to app settings).
  • Calling permission requests without awaiting results can cause unexpected behavior.
dart
/* Wrong way: Not awaiting permission request */
void requestPermissionWrong() {
  Permission.camera.request(); // Missing await
}

/* Right way: Await permission request */
Future<void> requestPermissionRight() async {
  var status = await Permission.camera.request();
  if (status.isGranted) {
    // Proceed
  }
}
📊

Quick Reference

ActionCode ExampleDescription
Check permission statusawait Permission.location.statusReturns current permission status.
Request permissionawait Permission.location.request()Asks user to grant permission.
Check if grantedstatus.isGrantedTrue if permission is granted.
Open app settingsopenAppSettings()Opens device app settings page.

Key Takeaways

Always import and use the permission_handler package to manage app permissions in Flutter.
Check permission status before requesting to avoid unnecessary prompts.
Await permission requests to handle user responses correctly.
Add required permissions in AndroidManifest.xml and Info.plist for the package to work.
Handle permanently denied permissions by guiding users to app settings.