permission_inspector 0.0.3 copy "permission_inspector: ^0.0.3" to clipboard
permission_inspector: ^0.0.3 copied to clipboard

A developer-only permission debugger overlay for Flutter. Inspect live permission states, track changes, and debug permission issues in real-time.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:permission_inspector/permission_inspector.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Permission Inspector Demo',
      theme: ThemeData(primarySwatch: Colors.blue, useMaterial3: true),
      home: const DemoScreen(),
    );
  }
}

class DemoScreen extends StatefulWidget {
  const DemoScreen({super.key});

  @override
  State<DemoScreen> createState() => _DemoScreenState();
}

class _DemoScreenState extends State<DemoScreen> {
  String _lastResult = 'No requests yet';

  @override
  void initState() {
    super.initState();
    // Auto-show inspector in debug mode
    if (kDebugMode) {
      WidgetsBinding.instance.addPostFrameCallback((_) {
        PermissionInspector.showOverlay(context);
      });
    }
  }

  Future<void> _requestCamera() async {
    final status = await PermissionInspector.request(Permission.camera);
    setState(() {
      _lastResult = 'Camera: ${status.name}';
    });
  }

  Future<void> _requestMicrophone() async {
    final status = await PermissionInspector.request(Permission.microphone);
    setState(() {
      _lastResult = 'Microphone: ${status.name}';
    });
  }

  Future<void> _requestLocation() async {
    final status = await PermissionInspector.request(Permission.location);
    setState(() {
      _lastResult = 'Location: ${status.name}';
    });
  }

  Future<void> _requestPhotos() async {
    final status = await PermissionInspector.request(Permission.photos);
    setState(() {
      _lastResult = 'Photos: ${status.name}';
    });
  }

  void _simulateDenied() {
    PermissionInspector.simulatePermission(
      Permission.camera,
      PermissionStatus.denied,
    );
    setState(() {
      _lastResult = 'Camera simulated as DENIED';
    });
  }

  void _simulateGranted() {
    PermissionInspector.simulatePermission(
      Permission.camera,
      PermissionStatus.granted,
    );
    setState(() {
      _lastResult = 'Camera simulated as GRANTED';
    });
  }

  void _clearSimulations() {
    PermissionInspector.clearAllSimulations();
    setState(() {
      _lastResult = 'All simulations cleared';
    });
  }

  void _toggleInspector() {
    PermissionInspector.toggleOverlay(context);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Permission Inspector Demo'),
        actions: [
          IconButton(
            icon: const Icon(Icons.security),
            onPressed: _toggleInspector,
            tooltip: 'Toggle Permission Inspector',
          ),
        ],
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            Card(
              child: Padding(
                padding: const EdgeInsets.all(16.0),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    const Text(
                      '🔥 Permission Inspector Demo',
                      style: TextStyle(
                        fontSize: 20,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                    const SizedBox(height: 8),
                    const Text(
                      'Look for the draggable overlay on your screen! '
                      'Try requesting permissions and see them tracked in real-time.',
                    ),
                    const SizedBox(height: 12),
                    Container(
                      padding: const EdgeInsets.all(12),
                      decoration: BoxDecoration(
                        color: Colors.blue.shade50,
                        borderRadius: BorderRadius.circular(8),
                      ),
                      child: Row(
                        children: [
                          const Icon(Icons.info_outline, color: Colors.blue),
                          const SizedBox(width: 8),
                          Expanded(
                            child: Text(
                              'Last Result: $_lastResult',
                              style: const TextStyle(
                                fontWeight: FontWeight.w500,
                              ),
                            ),
                          ),
                        ],
                      ),
                    ),
                  ],
                ),
              ),
            ),
            const SizedBox(height: 16),
            const Text(
              'Request Permissions',
              style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
            ),
            const SizedBox(height: 8),
            ElevatedButton.icon(
              onPressed: _requestCamera,
              icon: const Icon(Icons.camera_alt),
              label: const Text('Request Camera'),
            ),
            const SizedBox(height: 8),
            ElevatedButton.icon(
              onPressed: _requestMicrophone,
              icon: const Icon(Icons.mic),
              label: const Text('Request Microphone'),
            ),
            const SizedBox(height: 8),
            ElevatedButton.icon(
              onPressed: _requestLocation,
              icon: const Icon(Icons.location_on),
              label: const Text('Request Location'),
            ),
            const SizedBox(height: 8),
            ElevatedButton.icon(
              onPressed: _requestPhotos,
              icon: const Icon(Icons.photo_library),
              label: const Text('Request Photos'),
            ),
            const SizedBox(height: 24),
            const Text(
              'Test Simulations',
              style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
            ),
            const SizedBox(height: 8),
            OutlinedButton.icon(
              onPressed: _simulateDenied,
              icon: const Icon(Icons.block, color: Colors.orange),
              label: const Text('Simulate Camera Denied'),
            ),
            const SizedBox(height: 8),
            OutlinedButton.icon(
              onPressed: _simulateGranted,
              icon: const Icon(Icons.check_circle, color: Colors.green),
              label: const Text('Simulate Camera Granted'),
            ),
            const SizedBox(height: 8),
            OutlinedButton.icon(
              onPressed: _clearSimulations,
              icon: const Icon(Icons.clear_all),
              label: const Text('Clear All Simulations'),
            ),
            const Spacer(),
            Card(
              color: Colors.amber.shade50,
              child: const Padding(
                padding: EdgeInsets.all(12.0),
                child: Row(
                  children: [
                    Icon(Icons.lightbulb_outline, color: Colors.amber),
                    SizedBox(width: 8),
                    Expanded(
                      child: Text(
                        'Tap the shield icon in the app bar to toggle the inspector overlay',
                        style: TextStyle(fontSize: 12),
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
4
likes
160
points
20
downloads
screenshot

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

A developer-only permission debugger overlay for Flutter. Inspect live permission states, track changes, and debug permission issues in real-time.

Repository (GitHub)
View/report issues

License

MIT (license)

Dependencies

flutter, permission_handler

More

Packages that depend on permission_inspector