PackageTrack
Sign in Get early access

did_change_authlocal

A Flutter plugin to detect biometric data changes (Face ID, Touch ID, Fingerprint). Protects against unauthorized biometric enrollment.

1.0.1 5.7K downloads/mo #3642 most downloaded on pub.dev thongvo109/did_change_biometric

What this package is like to depend on

Last release 3 months ago

08 May 2026

Too new to tell

only 2 release windows

Nearly every release is documented

notes for 8 of 8 stable releases

Nothing withdrawn

no release was ever pulled

4 years old

8 releases · first in 2022

2 releases in the last 12 months

see the full history below

Release timeline

8 releases · Sep 2022 to May 2026
2023 2024 2025 2026
Release Pre-release

Releases

latest 8
  1. 1.0.1 08 May 2026
    Release notes
    • Update example Android to declarative Gradle plugins (AGP 8.7.0, Gradle 8.9)
    • Replace FlutterLifecycleAdapter with ProcessLifecycleOwner (standard AndroidX API)
    Open source →
  2. 1.0.0 07 May 2026
    Release notes

    Breaking Changes

    • Dart SDK: Minimum SDK bumped to >=3.0.0 <4.0.0 (Dart 3 with sound null safety)
    • Flutter: Minimum Flutter version bumped to >=3.10.0
    • Android: Minimum SDK bumped to API 23 (Android 6.0)
    • iOS: Minimum deployment target bumped to iOS 12.0
    • Internal platform-specific methods are now private (_checkBiometricIOS, _checkBiometricAndroid)

    New Features

    • onBiometricChanged stream ⭐ — Real-time biometric monitoring via native EventChannel on both iOS and Android. No Dart-side polling or lifecycle hacks needed.
      • Android: Uses Kotlin Coroutines StateFlow + DefaultLifecycleObserver.onResume + periodic polling fallback (5s)
      • iOS: Uses NotificationCenter.willEnterForegroundNotification + LAContext.evaluatedPolicyDomainState token comparison
      • Both platforms implement distinctUntilChanged natively — Dart only receives events when status actually changes
    • Swift Package Manager support (Issue #9) — Added Package.swift for SPM compatibility, migrating the iOS plugin to Pure Swift Architecture and resolving module conflicts.
    • Android face recognition note (Issue #7) — Clarified that Android KeyStore invalidation natively detects Face Recognition changes only if the device manufacturer implements it as a Class 3 (Strong) biometric (e.g. Pixel 4).
    • Persistent AuthLocalStatus binding (Feature Request) — The AuthLocalStatus.changed state now stays bound (locked) across app restarts until explicitly released by calling the new acknowledgeChange() API.
    • iOS check method — iOS now supports the same check MethodChannel call as Android, enabling consistent cross-platform one-shot checks
    • iOS BiometricStreamHandler — Full native FlutterStreamHandler implementation with lifecycle observation, baseline token tracking, and automatic cleanup

    Bug Fixes

    • Fixed Android plugin running unreachable code after result.success() / result.error()
    • Fixed iOS authenticateBiometric using deprecated base64EncodedData() instead of base64EncodedString()
    • Fixed example app missing dispose() for WidgetsBindingObserver (memory leak)
    • Fixed example app typo HomwPageHomePage

    Improvements

    • Platform-agnostic Dart code: Both iOS and Android now emit through the same EventChannel with identical status strings — the Dart layer is completely platform-agnostic
    • No more WidgetsBindingObserver: All lifecycle monitoring is handled natively (Kotlin + Swift), eliminating Dart-side workarounds
    • Added comprehensive dartdoc comments throughout the API
    • Added @visibleForTesting annotation for methodChannel and eventChannel
    • Used Dart 3 switch expressions instead of switch statements
    • Used typed invokeMethod<String> calls for type safety
    • Upgraded Android Kotlin from 1.6.10 → 1.9.22
    • Upgraded Android Gradle Plugin from 4.1.0 → 7.4.2
    • Upgraded Android compileSdk from 31 → 34
    • Upgraded Android Java target from 1.8 → 17
    • Added Kotlin Coroutines 1.7.3 and AndroidX Lifecycle 2.7.0 dependencies
    • Added namespace in build.gradle (required by AGP 7+)
    • Removed deprecated package attribute from AndroidManifest.xml
    • Upgraded flutter_lints to v5
    Open source →
    Release notes

    Breaking Changes

    • Dart SDK: Minimum SDK bumped to >=3.0.0 <4.0.0 (Dart 3 with sound null safety)
    • Flutter: Minimum Flutter version bumped to >=3.10.0
    • Android: Minimum SDK bumped to API 23 (Android 6.0)
    • iOS: Minimum deployment target bumped to iOS 12.0
    • Internal platform-specific methods are now private (_checkBiometricIOS, _checkBiometricAndroid)

    New Features

    • onBiometricChanged stream ⭐ — Real-time biometric monitoring via native EventChannel on both iOS and Android. No Dart-side polling or lifecycle hacks needed.
      • Android: Uses Kotlin Coroutines StateFlow + DefaultLifecycleObserver.onResume + periodic polling fallback (5s)
      • iOS: Uses NotificationCenter.willEnterForegroundNotification + LAContext.evaluatedPolicyDomainState token comparison
      • Both platforms implement distinctUntilChanged natively — Dart only receives events when status actually changes
    • Swift Package Manager support (Issue #9) — Added Package.swift for SPM compatibility, migrating the iOS plugin to Pure Swift Architecture and resolving module conflicts.
    • Android face recognition note (Issue #7) — Clarified that Android KeyStore invalidation natively detects Face Recognition changes only if the device manufacturer implements it as a Class 3 (Strong) biometric (e.g. Pixel 4).
    • Persistent AuthLocalStatus binding (Feature Request) — The AuthLocalStatus.changed state now stays bound (locked) across app restarts until explicitly released by calling the new acknowledgeChange() API.
    • iOS check method — iOS now supports the same check MethodChannel call as Android, enabling consistent cross-platform one-shot checks
    • iOS BiometricStreamHandler — Full native FlutterStreamHandler implementation with lifecycle observation, baseline token tracking, and automatic cleanup

    Bug Fixes

    • Fixed Android plugin running unreachable code after result.success() / result.error()
    • Fixed iOS authenticateBiometric using deprecated base64EncodedData() instead of base64EncodedString()
    • Fixed example app missing dispose() for WidgetsBindingObserver (memory leak)
    • Fixed example app typo HomwPageHomePage

    Improvements

    • Platform-agnostic Dart code: Both iOS and Android now emit through the same EventChannel with identical status strings — the Dart layer is completely platform-agnostic
    • No more WidgetsBindingObserver: All lifecycle monitoring is handled natively (Kotlin + Swift), eliminating Dart-side workarounds
    • Added comprehensive dartdoc comments throughout the API
    • Added @visibleForTesting annotation for methodChannel and eventChannel
    • Used Dart 3 switch expressions instead of switch statements
    • Used typed invokeMethod<String> calls for type safety
    • Upgraded Android Kotlin from 1.6.10 → 1.9.22
    • Upgraded Android Gradle Plugin from 4.1.0 → 7.4.2
    • Upgraded Android compileSdk from 31 → 34
    • Upgraded Android Java target from 1.8 → 17
    • Added Kotlin Coroutines 1.7.3 and AndroidX Lifecycle 2.7.0 dependencies
    • Added namespace in build.gradle (required by AGP 7+)
    • Removed deprecated package attribute from AndroidManifest.xml
    • Upgraded flutter_lints to v5
    Open source →
  3. 0.0.6 07 Sep 2022
    Release notes
    • Update README.md
    Open source →
  4. 0.0.5 07 Sep 2022
    Release notes
    • Update README.md
    Open source →
  5. 0.0.4 07 Sep 2022
    Release notes
    • Update README.md
    Open source →
  6. 0.0.3 07 Sep 2022
    Release notes
    • Update README.md
    Open source →
  7. 0.0.2 07 Sep 2022
    Release notes
    • Update example and refactor
    Open source →
  8. 0.0.1 06 Sep 2022
    Release notes
    • Initial release
    Open source →

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive