繁体   English   中英

在 Flutter 中,我使用 local_auth 0.6.2+3 package 并实现了示例代码。 单击身份验证按钮时出现以下错误

[英]In Flutter, I am using local_auth 0.6.2+3 package and implemented the example code. I get the following error when I click the authenticate button

Package 使用了 https://pub.dev/packages/local_auth/versions代码实现与示例中完全相同。 https://pub.dev/packages/local_auth#-example-tab-

错误描述:I/flutter(7978):PlatformException(no_fragment_activity,local_auth 插件要求活动为 FragmentActivity。,null)

这是最终结果的屏幕截图。 按第三个按钮“验证”时发生错误。 它更改为“取消”,并将上述错误抛出到“no_fragment_activity”的控制台。

示例代码屏幕

我刚刚构建了 local_auth 示例,它可以工作(版本 0.6.3.4)。 在我完成的步骤之后:

  1. 创建一个新的 flutter 应用程序:

    flutter create -a java -t app --project-name mywallet mywallet

注意,我使用的是 java 语言。

  1. 将依赖项添加到 local_auth:
dependencies:
  local_auth: ^0.6.3+4
  1. 从以下位置复制 main.dart class: local_auth 页面

  2. 以这种方式修改 MainActivity.java:

MainActivity.java

package com.example.mywallet;
import android.os.Bundle;
import io.flutter.app.FlutterFragmentActivity;
import io.flutter.plugins.GeneratedPluginRegistrant;
import android.os.Bundle; 
import io.flutter.app.FlutterFragmentActivity;
import io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin;
import io.flutter.plugins.localauth.LocalAuthPlugin;

@SuppressWarnings("deprecation")
public class MainActivity extends FlutterFragmentActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
 
  FlutterAndroidLifecyclePlugin.registerWith(
        registrarFor(
            "io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin"));
    LocalAuthPlugin.registerWith(registrarFor("io.flutter.plugins.localauth.LocalAuthPlugin"));
    

  }
}

然后,修改 android 清单以允许 flutter 片段启动:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mywallet">
    <uses-permission android:name="android.permission.USE_FINGERPRINT"/>

    <application android:name="io.flutter.app.FlutterApplication" android:label="local_auth_example" android:icon="@mipmap/ic_launcher">
      <activity android:name="io.flutter.embedding.android.FlutterFragmentActivity"
                android:launchMode="singleTop"
                android:theme="@style/Theme.AppCompat.Light"
                android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection"
                android:hardwareAccelerated="true"
                android:windowSoftInputMode="adjustResize">
          <intent-filter>
              <action android:name="android.intent.action.MAIN"/>
              <category android:name="android.intent.category.LAUNCHER"/>
          </intent-filter>
      </activity>
      <activity
          android:name=".MainActivity"
          android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale"
          android:hardwareAccelerated="true"
          android:windowSoftInputMode="adjustResize">
      </activity>
      <meta-data android:name="flutterEmbedding" android:value="2"/>
  </application>
</manifest>

现在,如果您在调试模式下构建应用程序,则该应用程序正在运行,不幸的是,在发布模式下,它将出现以下异常:

E/AndroidRuntime(27487): FATAL EXCEPTION: main
E/AndroidRuntime(27487): Process: com.example.mywallet, PID: 27487
E/AndroidRuntime(27487): java.lang.IllegalAccessError: Interface androidx.lifecycle.b implemented by class io.flutter.plugins.localauth.AuthenticationHelper is inaccessible (declaration of 'io.flutter.plugins.localauth.AuthenticationHelper' appears in /data/app/com.example.mywallet-t-m1EbOiZo85yTCgTK9tWw==/base.apk)
E/AndroidRuntime(27487):        at io.flutter.plugins.GeneratedPluginRegistrant.registerWith(Unknown Source:16)
E/AndroidRuntime(27487):        at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(27487):        at io.flutter.embedding.engine.h.g.a.a(Unknown Source:25)
E/AndroidRuntime(27487):        at io.flutter.embedding.android.FlutterFragmentActivity.g(Unknown Source:0)

为了避免这个问题,您可以添加文件:

proguard-rules.pro

在 android/app/src 中使用以下行:

  -keep class androidx.lifecycle.DefaultLifecycleObserver

现在它起作用了!

在我的 flutter 医生之后:

~/Projects/mywallet$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel master, 1.25.0-5.0.pre.93, on Linux, locale it_IT.UTF-8)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.0-rc4)
[✓] Chrome - develop for the web
[✓] Linux toolchain - develop for Linux desktop
[✓] Android Studio (version 4.0)
[✓] IntelliJ IDEA Community Edition (version 2020.2)
[✓] VS Code (version 1.51.1)
[✓] Connected device (4 available)

• No issues found!

这个简单的应用程序在三星(使用 knox)上以发布模式和模拟器进行了测试:

~/Projects/mywallet$ flutter devices
4 connected devices:

SM A307FN (mobile)                 • RF8M9278QSF   • android-arm64  • Android 10 (API 29)
Android SDK built for x86 (mobile) • emulator-5554 • android-x86    • Android 10 (API 29) (emulator)
Linux (desktop)                    • linux         • linux-x64      • Linux
Chrome (web)                       • chrome        • web-javascript • Google Chrome 87.0.4280.88

您只是忘记从FlutterActivity更改为FlutterFragmentActivity

此步骤出现在local_auth package 的自述文件中,在Android Integration部分中

请注意,local_auth 插件需要使用 FragmentActivity 而不是 Activity。 这可以通过在清单中切换到使用 FlutterFragmentActivity 而不是 FlutterActivity 来轻松完成(如果您正在扩展基类,则可以使用您自己的 Activity class)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM