face_detection_lock 0.3.0 copy "face_detection_lock: ^0.3.0" to clipboard
face_detection_lock: ^0.3.0 copied to clipboard

Face detection lock screen widget for Flutter. Unlocks when a face is detected.

example/lib/main.dart

import 'dart:developer';

import 'package:face_detection_lock/face_detection_lock.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const ExampleApp());
}

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

  @override
  Widget build(BuildContext context) {
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ]);
    return MaterialApp(
      title: 'Face Detection Lock Demo',
      theme: ThemeData(
        colorSchemeSeed: Colors.indigo,
        useMaterial3: true,
      ),
      home: const DemoSelector(),
    );
  }
}

// ---------------------------------------------------------------------------
// Demo selector — three modes
// ---------------------------------------------------------------------------

enum DemoMode { basic, verification, advanced }

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

  @override
  State<DemoSelector> createState() => _DemoSelectorState();
}

class _DemoSelectorState extends State<DemoSelector> {
  DemoMode _mode = DemoMode.basic;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: switch (_mode) {
        DemoMode.basic => const _BasicDemo(),
        DemoMode.verification => const _VerificationDemo(),
        DemoMode.advanced => const _AdvancedDemo(),
      },
      bottomNavigationBar: NavigationBar(
        selectedIndex: _mode.index,
        onDestinationSelected: (i) => setState(() {
          _mode = DemoMode.values[i];
        }),
        destinations: const [
          NavigationDestination(
            icon: Icon(Icons.face),
            label: 'Basic',
          ),
          NavigationDestination(
            icon: Icon(Icons.verified_user),
            label: 'Verification',
          ),
          NavigationDestination(
            icon: Icon(Icons.cloud),
            label: 'Advanced',
          ),
        ],
      ),
    );
  }
}

// ---------------------------------------------------------------------------
// 1. Basic — any face unlocks (simplest usage)
// ---------------------------------------------------------------------------

class _BasicDemo extends StatelessWidget {
  const _BasicDemo();

  @override
  Widget build(BuildContext context) {
    return const FaceDetectionLock(
      body: _UnlockedContent(title: 'Basic Mode'),
      enableHapticFeedback: true,
    );
  }
}

// ---------------------------------------------------------------------------
// 2. Verification — local on-device face verification
// ---------------------------------------------------------------------------

class _VerificationDemo extends StatelessWidget {
  const _VerificationDemo();

  @override
  Widget build(BuildContext context) {
    return FaceDetectionLock(
      verificationProvider: LocalFaceVerificationProvider(),
      unverifiedScreen: const Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Icon(Icons.person_off, size: 64, color: Colors.red),
            SizedBox(height: 16),
            Text(
              'Face not recognized',
              style: TextStyle(color: Colors.white, fontSize: 18),
            ),
            SizedBox(height: 8),
            Text(
              'Enroll your face first via the provider API.',
              style: TextStyle(color: Colors.white54, fontSize: 14),
            ),
          ],
        ),
      ),
      body: const _UnlockedContent(title: 'Verification Mode'),
      enableHapticFeedback: true,
    );
  }
}

// ---------------------------------------------------------------------------
// 3. Advanced — controller managed above, with fallback provider
// ---------------------------------------------------------------------------

class _AdvancedDemo extends StatelessWidget {
  const _AdvancedDemo();

  @override
  Widget build(BuildContext context) {
    return FaceDetectionProvider(
      controller: FaceDetectionController(
        onFaceSnapshot: (faces) {
          log('Detected ${faces.length} face(s)');
        },
        detectionInterval: const Duration(milliseconds: 500),
        lockDelay: const Duration(seconds: 1),
        minFaceSize: 0.2,
        // Example: fallback provider (cloud → local).
        // In production, replace with a real FaceGateCloudProvider:
        //
        // verificationProvider: FallbackVerificationProvider(
        //   primary: FaceGateCloudProvider(
        //     baseUrl: 'https://api.facegate.example.com',
        //     apiKey: 'your-api-key',
        //   ),
        //   fallback: LocalFaceVerificationProvider(),
        // ),
      )..initializeCamera(),
      child: const FaceDetectionLock(
        isControllerProvidedAbove: true,
        body: _UnlockedContent(title: 'Advanced Mode'),
        transitionDuration: Duration(milliseconds: 400),
        enableHapticFeedback: true,
      ),
    );
  }
}

// ---------------------------------------------------------------------------
// Shared unlocked content
// ---------------------------------------------------------------------------

class _UnlockedContent extends StatelessWidget {
  const _UnlockedContent({required this.title});

  final String title;

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          const Icon(Icons.lock_open, size: 64, color: Colors.green),
          const SizedBox(height: 16),
          Text(
            title,
            style: Theme.of(context).textTheme.headlineMedium,
          ),
          const SizedBox(height: 8),
          const Text('Screen is unlocked!'),
        ],
      ),
    );
  }
}