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.xmlorInfo.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
| Action | Code Example | Description |
|---|---|---|
| Check permission status | await Permission.location.status | Returns current permission status. |
| Request permission | await Permission.location.request() | Asks user to grant permission. |
| Check if granted | status.isGranted | True if permission is granted. |
| Open app settings | openAppSettings() | 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.