Flutter plugin to store data behind biometric authentication (ie. fingerprint)

Overview

biometric_storage

Pub

Encrypted file store, optionally secured by biometric lock for Android, iOS, MacOS and partial support for Linux, Windows and Web.

Meant as a way to store small data in a hardware encrypted fashion. E.g. to store passwords, secret keys, etc. but not massive amounts of data.

  • Android: Uses androidx with KeyStore.
  • iOS and MacOS: LocalAuthentication with KeyChain.
  • Linux: Stores values in Keyring using libsecret. (No biometric authentication support).
  • Windows: Uses wincreds.h to store into read/write into credential store.
  • Web: Warning Uses unauthenticated, unencrypted storage in localStorage. If you have a better idea for secure storage on web platform, please open an Issue.

Check out AuthPass Password Manager for a app which makes heavy use of this plugin.

Getting Started

Installation

Android

  • Requirements:
    • Android: API Level >= 23 (android/app/build.gradle minSdkVersion 23)

    • Make sure to use the latest kotlin version:

      • android/build.gradle: ext.kotlin_version = '1.4.31'
    • MainActivity must extend FlutterFragmentActivity

    • Theme for the main activity must use Theme.AppCompat thme. (Otherwise there will be crases on Android < 29) For example:

      AndroidManifest.xml:

      <activity
      android:name=".MainActivity"
      android:launchMode="singleTop"
      android:theme="@style/LaunchTheme"

      xml/styles.xml:

          <style name="LaunchTheme" parent="Theme.AppCompat.NoActionBar">
          <!-- Show a splash screen on the activity. Automatically removed when
               Flutter draws its first frame -->
          <item name="android:windowBackground">@drawable/launch_background</item>
      
          <item name="android:windowNoTitle">true</item>
          <item name="android:windowActionBar">false</item>
          <item name="android:windowFullscreen">true</item>
          <item name="android:windowContentOverlay">@null</item>
      </style>
Resources

iOS

https://developer.apple.com/documentation/localauthentication/logging_a_user_into_your_app_with_face_id_or_touch_id

  • include the NSFaceIDUsageDescription key in your app’s Info.plist file
  • Requires at least iOS 9

Mac OS

  • include the NSFaceIDUsageDescription key in your app’s Info.plist file
  • enable keychain sharing and signing. (not sure why this is required. but without it You will probably see an error like:

    SecurityError, Error while writing data: -34018: A required entitlement isn't present.

  • Requires at least Mac OS 10.12

Usage

You basically only need 4 methods.

  1. Check whether biometric authentication is supported by the device
  final response = await BiometricStorage().canAuthenticate()
  if (response != CanAuthenticateResponse.success) {
    // panic..
  }
  1. Create the access object
  final store = BiometricStorage().getStorage('mystorage');
  1. Read data
  final data = await storageFile.read();
  1. Write data
  final myNewData = 'Hello World';
  await storageFile.write(myNewData);

See also the API documentation: https://pub.dev/documentation/biometric_storage/latest/biometric_storage/BiometricStorageFile-class.html#instance-methods

Comments
  • Authenticated Option on Samsung device throws Exception

    Authenticated Option on Samsung device throws Exception

    Greetings and thank you for creating this plugin!

    I was able to get your example working (v1.1.0+1) while using the Biometric Authenticated option on my iPhone X (14.2) and my Pixel 3 (Android 11) just fine but on my Samsung S8+ (Android 9, One UI 1.0) when I write, it throws the following exception:

    java.security.KeyStoreException: the master key android-keystore://default_authenticated_master_key exists but is unusable java.security.KeyStoreException: the master key android-keystore://default_authenticated_master_key exists but is unusable at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.readOrGenerateNewMasterKey(AndroidKeysetManager.java:268) at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.build(AndroidKeysetManager.java:228) at androidx.security.crypto.EncryptedFile$Builder.build(EncryptedFile.java:200) at design.codeux.biometric_storage.BiometricStorageFile.buildEncryptedFile(BiometricStorageFile.kt:67) at design.codeux.biometric_storage.BiometricStorageFile.writeFile(BiometricStorageFile.kt:73) at design.codeux.biometric_storage.BiometricStoragePlugin$onMethodCall$8$1.invoke(BiometricStoragePlugin.kt:195) at design.codeux.biometric_storage.BiometricStoragePlugin$onMethodCall$8$1.invoke(BiometricStoragePlugin.kt:76) at design.codeux.biometric_storage.BiometricStoragePlugin$onMethodCall$4$1.invoke(BiometricStoragePlugin.kt:159) at design.codeux.biometric_storage.BiometricStoragePlugin$onMethodCall$4$1.invoke(BiometricStoragePlugin.kt:76) at design.codeux.biometric_storage.BiometricStoragePlugin$authenticate$prompt$1$onAuthenticationSucceeded$$inlined$ui$1.run(BiometricStoragePlugin.kt:290) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7073) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964) Caused by: android.security.keystore.UserNotAuthenticatedException: User not authenticated at android.security.KeyStore.getInvalidKeyException(KeyStore.java:1233) at android.security.KeyStore.getInvalidKeyException(KeyStore.java:1331) at android.security.keystore.KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(KeyStoreCryptoOperationUtils.java:54) at android.security.keystore.KeyStoreCryptoOperationUtils.getExceptionForCipherInit(KeyStoreCryptoOperationUtils.java:89) at android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreCipherSpiBase.java:265) at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:109) at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:2984) at javax.crypto.Cipher.tryCombinations(Cipher.java:2891) at javax.crypto.Cipher$SpiAndProviderUpdater.updateAndGetSpiAndProvider(Cipher.java:2796) at javax.crypto.Cipher.chooseProvider(Cipher.java:773) at javax.crypto.Cipher.init(Cipher.java:1143) at javax.crypto.Cipher.init(Cipher.java:1084) at com.google.crypto.tink.integration.android.AndroidKeystoreAesGcm.encrypt(AndroidKeystoreAesGcm.java:69) at com.google.crypto.tink.integration.android.AndroidKeystoreKmsClient.validateAead(AndroidKeystoreKmsClient.java:226) at com.google.crypto.tink.integration.android.AndroidKeystoreKmsClient.getAead(AndroidKeystoreKmsClient.java:160) at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.readOrGenerateNewMasterKey(AndroidKeysetManager.java:259) ... 16 more

    Please advise.

    opened by html-rulez-d00d 28
  • Compiling on linux fails

    Compiling on linux fails

    Compiling an app that depends on biometric_storage fails on the latest ~~master channel~~ stable release with the following error message (on linux and I'd guess on macos as well):

    dart_tool/flutter_build/generated_main.dart:47:9: Error: Undefined name 'Win32BiometricStoragePlugin'.
            Win32BiometricStoragePlugin.registerWith();
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    I think this might be related to recent changes to dartPluginClass by flutter, so if you think this is flutter's bug and not yours feel free to close this issue :)

    opened by miDeb 23
  • Mention required proguard configuration in README

    Mention required proguard configuration in README

    Hi all,

    I just tried to integrate this great package in freshly created flutter app with no other content.

    I faced quite some problems getting it to build due to some java.lang.NoSuchMethodError: kotlin.jvm.internal.FunctionReferenceImpl.<init> exceptions during the build.

    Gladly I remembered a similar problem I had that required to enable Proguard.

    I saw that you have enabled Proguard as well in this commit: https://github.com/authpass/biometric_storage/commit/b37f0d7390b93ac21935862625348eebef5c4cdd

    Maybe this information should be added to the README.

    Looking forward to your comments.

    Benjamin

    opened by benjaminSchilling33 12
  • Exception when using pre release version - 3.0.0-rc.6

    Exception when using pre release version - 3.0.0-rc.6

    I/flutter (25078): login error: PlatformException(Unexpected Error, User not authenticated, android.security.keystore.UserNotAuthenticatedException: User not authenticated I/flutter (25078): android.security.keystore.UserNotAuthenticatedException: User not authenticated I/flutter (25078): at android.security.KeyStore.getInvalidKeyException(KeyStore.java:1497) I/flutter (25078): at android.security.KeyStore.getInvalidKeyException(KeyStore.java:1539) I/flutter (25078): at android.security.keystore.KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(KeyStoreCryptoOperationUtils.java:54) I/flutter (25078): at android.security.keystore.KeyStoreCryptoOperationUtils.getExceptionForCipherInit(KeyStoreCryptoOperationUtils.java:89) I/flutter (25078): at android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreCipherSpiBase.java:265) I/flutter (25078): at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:109) I/flutter (25078): at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:2984) I/flutter (25078): at javax.crypto.Cipher.tryCombinations(Cipher.java:2891) I/flutter (25078): at javax.crypto.Cipher$SpiAndProviderUpdater.updateAndGetSpiAndProvider(Cipher.java:2796) I/flutter (25078): at javax.crypto.Cipher.chooseProvider(Cipher.java:773) I/flutter (25078): at javax.crypto.Cipher.init(Cipher.java:1143) I/flutter (25078): at javax.crypto.Cipher.init(Cipher.java:1084) I/flutter (25078): at design.codeux.biometric_storage.CryptographyManagerImpl.getInitializedCipherForEncryption(CryptographyManager.kt:94) I/flutter (25078): at design.codeux.biometric_storage.BiometricStorageFile.cipherForEncrypt(BiometricStorageFile.kt:68) I/flutter (25078): at design.codeux.biometric_storage.BiometricStoragePlugin$onMethodCall$4.invoke(BiometricStoragePlugin.kt:154) I/flutter (25078): at design.codeux.biometric_storage.BiometricStoragePlugin$onMethodCall$8.invoke(BiometricStoragePlugin.kt:198) I/flutter (25078): at design.codeux.biometric_storage.BiometricStoragePlugin$onMethodCall$8.invoke(BiometricStoragePlugin.kt:88) I/flutter (25078): at design.codeux.biometric_storage.BiometricStoragePlugin$onMethodCall$3.invoke(BiometricStoragePlugin.kt:146) I/flutter (25078): at design.codeux.biometric_storage.BiometricStoragePlugin.onMethodCall(BiometricStoragePlugin.kt:198) I/flutter (25078): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233) I/flutter (25078): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85) I/flutter (25078): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:818) I/flutter (25078): at android.os.MessageQueue.nativePollOnce(Native Method) I/flutter (25078): at android.os.MessageQueue.next(MessageQueue.java:335) I/flutter (25078): at android.os.Looper.loop(Looper.java:206) I/flutter (25078): at android.app.ActivityThread.main(ActivityThread.java:8528) I/flutter (25078): at java.lang.reflect.Method.invoke(Native Method) I/flutter (25078): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) I/flutter (25078): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) I/flutter (25078): , null) - stack: #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:597:7) I/flutter (25078): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:158:18)

    opened by Androrier 11
  • Build Failure on Android

    Build Failure on Android

    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':biometric_storage:kaptGenerateStubsDebugKotlin'.
    > Could not resolve all files for configuration ':biometric_storage:debugCompileClasspath'.
       > Failed to transform moshi-1.13.0.jar (com.squareup.moshi:moshi:1.13.0) to match attributes {artifactType=android-classes-jar, org.gradle.category=library, org.gradle.dependency.bundling=external, org.gradle.jvm.environment=standard-jvm, org.gradle.jvm.version=8, org.gradle.libraryelements=jar, org.gradle.status=release, org.gradle.usage=java-api, org.jetbrains.kotlin.platform.type=jvm}.
          > Execution failed for JetifyTransform: C:\Users\xeine\.gradle\caches\modules-2\files-2.1\com.squareup.moshi\moshi\1.13.0\da685586facab9eb5c4fb630ce248be14e7da21b\moshi-1.13.0.jar.
             > Failed to transform 'C:\Users\xeine\.gradle\caches\modules-2\files-2.1\com.squareup.moshi\moshi\1.13.0\da685586facab9eb5c4fb630ce248be14e7da21b\moshi-1.13.0.jar' using Jetifier. Reason: IllegalArgumentException, message: Unsupported class file major version 60. (Run with --stacktrace for more details.)
               Suggestions:
                - Check out existing issues at https://issuetracker.google.com/issues?q=componentid:460323&s=modified_time:desc, it's possible that this issue has already been filed there.
                - If this issue has not been filed, please report it at https://issuetracker.google.com/issues/new?component=460323 (run with --stacktrace and provide a stack trace if possible).
    
    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
    
    * Get more help at https://help.gradle.org
    
    BUILD FAILED in 23s
    Exception: Gradle task assembleDebug failed with exit code 1
    
    
    

    Flutter Doctor

    
    [√] Flutter (Channel stable, 2.10.3, on Microsoft Windows [Version 10.0.22000.588], locale en-DE)
        • Flutter version 2.10.3 at C:\tools\flutter
        • Upstream repository https://github.com/flutter/flutter.git
        • Framework revision 7e9793dee1 (3 weeks ago), 2022-03-02 11:23:12 -0600
        • Engine revision bd539267b4
        • Dart version 2.16.1
        • DevTools version 2.9.2
    
    [√] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
        • Android SDK at C:\Users\xeine\AppData\Local\Android\Sdk
        • Platform android-31, build-tools 31.0.0
        • ANDROID_SDK_ROOT = C:\Users\xeine\AppData\Local\Android\Sdk
        • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
        • Java version OpenJDK Runtime Environment (build 11.0.11+9-b60-7590822)
        • All Android licenses accepted.
    
    [√] Chrome - develop for the web
        • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe
    
    [X] Visual Studio - develop for Windows
        X Visual Studio not installed; this is necessary for Windows development.
          Download at https://visualstudio.microsoft.com/downloads/.
          Please install the "Desktop development with C++" workload, including all of its default components
    
    [√] Android Studio (version 2021.1)
        • Android Studio at C:\Program Files\Android\Android Studio
        • Flutter plugin can be installed from:
           https://plugins.jetbrains.com/plugin/9212-flutter
        • Dart plugin can be installed from:
           https://plugins.jetbrains.com/plugin/6351-dart
        • Java version OpenJDK Runtime Environment (build 11.0.11+9-b60-7590822)
    
    [√] Connected device (3 available)
        • Windows (desktop) • windows • windows-x64    • Microsoft Windows [Version 10.0.22000.588]
        • Chrome (web)      • chrome  • web-javascript • Google Chrome 99.0.4844.74
        • Edge (web)        • edge    • web-javascript • Microsoft Edge 97.0.1072.69
    
    [√] HTTP Host Availability
        • All required HTTP hosts are available
    
    
    opened by xeinebiu 10
  • iOS Simulator FaceID never popups

    iOS Simulator FaceID never popups

    FaceID is enrolled in Simulator settings

    Code

    final storage = await BiometricStorage().getStorage('test');
    
    try {
      await storage.write('value');
    } catch (e) {
      return console.error('biometric error: $e');
    }
    

    Error PlatformException(SecurityError, Error while writing data: -25293: The user name or passphrase you entered is not correct., null, null)

    opened by oliverbytes 9
  • Minimum supported Gradle version is 6.5

    Minimum supported Gradle version is 6.5

    Hi there,

    Thanks for your library! Lately I upgraded my project flutter and Android, and when building for release I'm getting this error:

    `Build file '/.pub-cache/hosted/pub.dartlang.org/biometric_storage-3.0.0-rc.2/android/build.gradle' line: 24

    What went wrong: A problem occurred evaluating root project 'biometric_storage'.

    Failed to apply plugin [id 'com.android.internal.version-check'] Minimum supported Gradle version is 6.5. Current version is 5.4.1. If using the gradle wrapper, try editing the distributionUrl in /.pub-cache/hosted/pub.dartlang.org/biometric_storage-3.0.0-rc.2/android/gradle/wrapper/gradle-wrapper.properties to gradle-6.5-all.zip`

    opened by aelahmar 8
  • [web]: Use SecureLS for an encrypted storage for web

    [web]: Use SecureLS for an encrypted storage for web

    Here: https://www.npmjs.com/package/secure-ls

    I already integrated that in the very first stage of Flutter web and you just have to import the module in your index.html.

    opened by Ahmadre 8
  • Question: How to use

    Question: How to use "authenticationValidityDurationSeconds"?

    Hi,

    Thank you for making this package.

    StorageFileInitOptions( authenticationValidityDurationSeconds: 30, ),

    As far as I understand, when I set authenticationValidityDurationSeconds to 30, the storage file should not require authentication for 30 seconds for any read or write actions.

    But my working sample with Samsung Galaxy Note 10 asks authentication per every actions (read and write). (no matter how long I set the validity duration).

    Thank for your help!

    Wonmo

    opened by croquies 8
  • Enable setInvalidatedByBiometricEnrollment

    Enable setInvalidatedByBiometricEnrollment

    Hello, I have a question, it is possible to enable setInvalidatedByBiometricEnrollment?

    I need to use setInvalidatedByBiometricEnrollment(true) while generating key and the key gets invalidated on any new biometric enrollment. An exception is thrown when you try to use the same key. In this situation, you can reset the biometric app settings inside your app and start the process of enabling biometrics again.

    opened by EdinsonNM 8
  • Update DartPluginFile usage for windows

    Update DartPluginFile usage for windows

    Description

    • With the release of Flutter 2.8.0 to the stable channel, there are some changes with how dart only plugin implementations get registered.
    • Flutter generates a generated_main.dart file under the .dart-tool/flutter_build directory which for the example app for this plugin looks like this
    export 'package:biometric_storage_example/main.dart';
    
    import 'package:biometric_storage_example/main.dart' as entrypoint;
    import 'dart:io'; // flutter_ignore: dart_io_import.
    import 'package:biometric_storage/biometric_storage.dart';
    
    @pragma('vm:entry-point')
    class _PluginRegistrant {
    
      @pragma('vm:entry-point')
      static void register() {
        if (Platform.isAndroid) {
        } else if (Platform.isIOS) {
        } else if (Platform.isLinux) {
        } else if (Platform.isMacOS) {
        } else if (Platform.isWindows) {
          try {
            Win32BiometricStoragePlugin.register();
          } catch (err) {
            print(
              '`biometric_storage` threw an error: $err. '
              'The app may not function as expected until you remove this plugin from pubspec.yaml'
            );
            rethrow;
          }
    
        }
      }
    
    }
    
    typedef _UnaryFunction = dynamic Function(List<String> args);
    typedef _NullaryFunction = dynamic Function();
    
    void main(List<String> args) {
      if (entrypoint.main is _UnaryFunction) {
        (entrypoint.main as _UnaryFunction)(args);
      } else {
        (entrypoint.main as _NullaryFunction)();
      }
    }
    

    which will cause the following error when building the application

    Error: Undefined name 'Win32BiometricStoragePlugin'.
    .dart_tool/flutter_build/generated_main.dart:38
                Win32BiometricStoragePlugin.registerWith();
    
    • The flutter tooling is expecting
      • The Win32BiometricStoragePlugin class to be importable from package:biometric_storage/biometric_storage.dart'
      • The Win32BiometricStoragePlugin to define a static function registerWith()

    Changes

    • Removed the noop win32 file/implementation
    • Changed the default BiometricStorage.instance to be MethodChannelBiometricStorage
    • Exported the Win32BiometricStoragePlugin from lib/biometric_storage.dart
    • Defined Win32BiometricStoragePlugin.registerWith static method that registers an instance of Win32BiometricStoragePlugin as the instance provided by BiometricStorage.instance
    • Updated some various iOS project files based on Flutter tooling changes
    • Update the example to include biometric_storage as a normal dependency and not a dev dependency
    • Bumped the version to 4.0.0 because this is most likely a breaking change
    • Bumped the min Flutter SDK to 2.8.0 because I believe prior to this stable version the issue described above does not reproduce.

    Important Notes

    • If you try to reproduce this issue with the current release's example app and Flutter 2.8.0 it will NOT reproduce. The dependency on biometric_storage is a dev dependency instead of a normal dependency. It seems the the generated_main.dart file is not generated if a dev_dependency provides a Dart only plugin implementation. I have updated the example to provide biometric_storage as a normal dependency in this PR.

    Testing

    • I have verified this fixes the build issue on iOS and Android but cannot verify that the Linux and Windows implementations of this plugin are still working as expected because I do not have the proper hardware.
    opened by brianblanchard-wf 7
  • FaceId is not considered in Android Platform

    FaceId is not considered in Android Platform

    Hi, I am using latest version of biometric_storage in my app. In ios i am able to use FaceId but in android When FaceId is setup, biometricStorage.canAuthenticate() returns CanAuthenticateResponse.errorNoBiometricEnrolled.

    In Android with Fingerprint everything is fine, facing issue with FaceId alone. I followed all the instructions given in Getting started section.

    Is FaceId in Android not supported by biometric_storage or do we have to follow any additional steps for that?

    opened by hema-k83 0
  • The given test case from biometric_storage/test/biometric_storage_test.dart failed

    The given test case from biometric_storage/test/biometric_storage_test.dart failed

    I am trying mock the method channel "biometric_storage", but the mock response does not invoke while executing the test case.

    I tried to run the given test case and it failed.

    import 'package:biometric_storage/src/biometric_storage.dart';
    import 'package:flutter/services.dart';
    import 'package:flutter_test/flutter_test.dart';
    
    void main() {
      const channel = MethodChannel('biometric_storage');
    
      TestWidgetsFlutterBinding.ensureInitialized();
    
      setUp(() {
        channel.setMockMethodCallHandler((MethodCall methodCall) async {
          if (methodCall.method == 'canAuthenticate') {
            return 'ErrorUnknown';
          }
          throw PlatformException(code: 'NotImplemented');
        });
      });
    
      tearDown(() {
        channel.setMockMethodCallHandler(null);
      });
    
      test('canAuthenticate', () async {
        final result = await BiometricStorage().canAuthenticate();
        expect(result, CanAuthenticateResponse.unsupported);
      });
    }
    
    

    Here, BiometricStorage().canAuthenticate() return "errorHwUnavailable" despite mocking the response.

    can anyone help me out?

    opened by smeetbhatt1 0
  • Add method to check if storage file already exists

    Add method to check if storage file already exists

    Hello

    I use biometric storage to store a secret (generated EC key pair) at the first launch of my app. I have to check if the secret was already generated on subsequent launches without showing the authentication prompt if the secret already exists.

    Can you add a method to storageFile which checks if the file already exists?

    opened by UlrichRaab 0
  • Add possibility to invalidate storage after biometric changes

    Add possibility to invalidate storage after biometric changes

    Hi folks,

    Is it any chance to handle biometric changes in the package?

    There are methods on platforms: IOS: evaluatedPolicyDomainState Android: setInvalidatedByBiometricEnrollment

    thank you, hope the things are possible

    opened by vscmaster 0
  • Duplicate class

    Duplicate class

    [✓] Flutter (Channel stable, 3.3.6, on macOS 13.0 22A380 darwin-arm, locale zh-Hans-CN) [✓] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1) [✓] Xcode - develop for iOS and macOS (Xcode 14.0.1) [✓] Chrome - develop for the web [✓] Android Studio (version 2021.2) [✓] IntelliJ IDEA Ultimate Edition (version 2021.3) [✓] IntelliJ IDEA Community Edition (version 2022.1) [✓] VS Code (version 1.72.2) [✓] Connected device (3 available) [✓] HTTP Host Availability

    打包时遇到下面的异常 Duplicate class androidx.lifecycle.ViewModelLazy found in modules jetified-lifecycle-viewmodel-ktx-2.3.1-runtime (androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1) and lifecycle-viewmodel-2.5.1-runtime (androidx.lifecycle:lifecycle-viewmodel:2.5.1) Duplicate class androidx.lifecycle.ViewTreeViewModelKt found in modules jetified-lifecycle-viewmodel-ktx-2.3.1-runtime (androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1) and lifecycle-viewmodel-2.5.1-runtime (androidx.lifecycle:lifecycle-viewmodel:2.5.1)

    删除 android/build.gradle api "androidx.core:core-ktx:1.8.0" api "androidx.fragment:fragment-ktx:1.5.0"

    解决

    opened by liuguangmao 0
  • windows doesn't work with biometric_storage: ^4.1.3 when it's a transitive dependency

    windows doesn't work with biometric_storage: ^4.1.3 when it's a transitive dependency

    We are using biometric_storage in at_client_mobile. When we add at_client_mobile as dependency, biometric_storage throws following exception in Windows platform.

    flutter: #0      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:294:7)
    <asynchronous suspension>
    #1      MethodChannelBiometricStorage.getStorage (package:biometric_storage/src/biometric_storage.dart:318:22)
    <asynchronous suspension>
    #2      KeyChainManager.readAtClientData (package:at_client_mobile/src/keychain_manager.dart:35:21)
    <asynchronous suspension>
    #3      KeyChainManager.disableUsingSharedStorage (package:at_client_mobile/src/keychain_manager.dart:84:18)
    <asynchronous suspension>
    #4      KeyChainManager.initialSetup (package:at_client_mobile/src/keychain_manager.dart:78:7)
    <asynchronous suspension>
    #5      OnboardingService.initialSetup (package:at_onboarding_flutter/services/onboarding_service.dart:87:5)
    <asynchronous suspension>
    #6      _AtOnboardingStartScreenState._init (package:at_onboarding_flutter/screen/at_onboarding_start_screen.dart:37:5)
    <asynchronous suspension>
    

    Looks like some method channel functions are not getting invoked.

    If we add biometric_storage under the dependencies section directly, the issue does not come. This only seems to happen when biometric_storage is a transitive depedency.

    opened by sachins-geekyants 0
Releases(v4.1.2)
Owner
AuthPass
AuthPass – Password Manager
AuthPass
Ubuntu Software Store

Unofficial Ubuntu Store Flutter - WIP An alternative software store for the Ubuntu Desktop made with Flutter. First goals Great UX Adaptive Layout Sna

Frederik Feichtmeier 288 Jan 3, 2023
Flutter plugin for Flutter desktop(macOS/Linux/Windows) to change window size.

desktop_window Flutter plugin for Flutter desktop(macOS/Linux/Windows) to change window size. Usage import 'package:desktop_window/desktop_window.dart

ChunKoo Park 72 Dec 2, 2022
A clean front-end plugin to Volumio, the Linux distribution for music playback. Volumio Touch Display Lite is written in Flutter and runs on flutter-pi.

EN | 中文 Touch Display Lite plugin for Volumio 3 Feng Zhou, 2021-12 Touch Display Lite is a clean and fast user interface for Volumio 3, the Linux dist

Feng Zhou 5 Jul 26, 2022
File picker plugin for Flutter, compatible with mobile (iOS & Android), Web, Desktop (Mac, Linux, Windows) platforms with Flutter Go support.

A package that allows you to use the native file explorer to pick single or multiple files, with extensions filtering support.

Miguel Ruivo 987 Jan 6, 2023
A Flutter plugin to read 🔖 metadata of 🎵 media files. Supports Windows, Linux & Android.

flutter_media_metadata A Flutter plugin to read metadata of media files. A part of Harmonoid open source project ?? Install Add in your pubspec.yaml.

Harmonoid 60 Dec 2, 2022
This plugin allows Flutter desktop apps to defines system/inapp wide hotkey (i.e. shortcut).

hotkey_manager This plugin allows Flutter desktop apps to defines system/inapp wide hotkey (i.e. shortcut). hotkey_manager Platform Support Quick Star

LeanFlutter 81 Dec 21, 2022
A cross-platform flutter plugin for C/C++/ObjC crash report via Google Breakpad

quick_breakpad A cross-platform flutter plugin for C/C++/ObjC crash report via Google Breakpad Use breakpad for quick_breakpad_example $CLI_BREAKPAD i

Woodemi Co., Ltd 16 Jul 30, 2022
A cross-platform (Windows/macOS) scanner plugin for Flutter

quick_scanner A cross-platform (Windows/macOS) scanner plugin for Flutter Usage QuickScanner.startWatch(); var _scanners = await QuickScanner.getScan

Woodemi Co., Ltd 5 Jun 10, 2022
A cross-platform (Android/Windows/macOS/Linux) USB plugin for Flutter

quick_usb A cross-platform (Android/Windows/macOS/Linux) USB plugin for Flutter Usage List devices List devices with additional description Get device

Woodemi Co., Ltd 39 Oct 1, 2022
This plugin allows Flutter desktop apps to Retrieve information about screen size, displays, cursor position, etc.

screen_retriever This plugin allows Flutter desktop apps to Retrieve information about screen size, displays, cursor position, etc. screen_retriever P

LeanFlutter 27 Dec 6, 2022
This plugin allows Flutter desktop apps to extract text from screen.

screen_text_extractor This plugin allows Flutter desktop apps to extract text from screen. screen_text_extractor Platform Support Quick Start Installa

LeanFlutter 30 Dec 21, 2022
This plugin allows Flutter desktop apps to defines system tray.

tray_manager This plugin allows Flutter desktop apps to defines system tray. tray_manager Platform Support Quick Start Installation ⚠️ Linux requireme

LeanFlutter 122 Dec 22, 2022
This plugin allows Flutter desktop apps to resizing and repositioning the window.

window_manager This plugin allows Flutter desktop apps to resizing and repositioning the window. window_manager Platform Support Quick Start Installat

LeanFlutter 351 Jan 7, 2023
A Flutter Web Plugin to display Text Widget as Html for SEO purpose

SEO Renderer A flutter plugin (under development) to render text widgets as html elements for SEO purpose. Created specifically for issue https://gith

Sahdeep Singh 103 Nov 21, 2022
This plugin allows Flutter desktop apps to register and handle custom protocols

protocol_handler This plugin allows Flutter desktop apps to register and handle custom protocols (i.e. deep linking). English | 简体中文 protocol_handler

LeanFlutter 57 Dec 22, 2022
A macOS plugin which can register a callback for a global keyboard shortcut.

global_shortcuts A macOS plugin which can register a callback for a global keyboard shortcut. As the shortcut is global, the callback will be triggere

James Leahy 7 Jan 2, 2023
An krunner plugin for changing kde plasma accent color from directly desktop

An krunner plugin for changing kde plasma accent color from directly desktop

Tanbir Jishan 3 Feb 21, 2022
Flutter Installer is an installer for Flutter built with Flutter 💙😎✌

Flutter Installer Flutter Installer is an installer for Flutter built with Flutter ?? ?? ✌ Flutter and the related logo are trademarks of Google LLC.

Yazeed AlKhalaf 406 Dec 27, 2022
A Flutter package that makes it easy to customize and work with your Flutter desktop app window.

bitsdojo_window A Flutter package that makes it easy to customize and work with your Flutter desktop app window on Windows, macOS and Linux. Watch the

Bits Dojo 607 Jan 4, 2023