flutter_appauth与local_auth共存时登录崩溃的解决方案咨询
问题:同时集成flutter_appauth与local_auth后出现Android主题兼容错误
项目依赖
cupertino_icons: ^1.0.2 http: ^0.13.6 local_auth: ^2.1.6 rxdart: ^0.27.7 bloc: ^8.1.2 google_fonts: ^4.0.4 flutter_secure_storage: ^8.0.0 flutter_appauth: ^6.0.0 flutter_bloc: ^8.1.3 flutter_spinkit: ^5.2.0 cached_network_image: ^3.2.3 just_audio: ^0.9.33 just_audio_background: ^0.0.1-beta.10 audio_video_progress_bar: ^1.0.1 sliding_up_panel: ^2.0.0+1
问题现象
未安装local_auth时,flutter_appauth登录功能正常;安装local_auth后,登录时抛出以下致命错误:
D/AndroidRuntime( 8319): Shutting down VM E/AndroidRuntime( 8319): FATAL EXCEPTION: main E/AndroidRuntime( 8319): Process: my.minda.mobile.player, PID: 8319 E/AndroidRuntime( 8319): java.lang.RuntimeException: Unable to start activity ComponentInfo{my.minda.mobile.player/net.openid.appauth.RedirectUriReceiverActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. E/AndroidRuntime( 8319): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3645) E/AndroidRuntime( 8319): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782) E/AndroidRuntime( 8319): at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) E/AndroidRuntime( 8319): at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) E/AndroidRuntime( 8319): at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) E/AndroidRuntime( 8319): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) E/AndroidRuntime( 8319): at android.os.Handler.dispatchMessage(Handler.java:106) E/AndroidRuntime( 8319): at android.os.Looper.loopOnce(Looper.java:201) E/AndroidRuntime( 8319): at android.os.Looper.loop(Looper.java:288) E/AndroidRuntime( 8319): at android.app.ActivityThread.main(ActivityThread.java:7872) E/AndroidRuntime( 8319): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime( 8319): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) E/AndroidRuntime( 8319): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) E/AndroidRuntime( 8319): Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. E/AndroidRuntime( 8319): at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:846) E/AndroidRuntime( 8319): at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:809) E/AndroidRuntime( 8319): at androidx.appcompat.app.AppCompatDelegateImpl.initWindowDecorActionBar(AppCompatDelegateImpl.java:550) E/AndroidRuntime( 8319): at androidx.appcompat.app.AppCompatDelegateImpl.getSupportActionBar(AppCompatDelegateImpl.java:537) E/AndroidRuntime( 8319): at androidx.appcompat.app.AppCompatDelegateImpl.invalidateOptionsMenu(AppCompatDelegateImpl.java:1220) E/AndroidRuntime( 8319): at androidx.appcompat.app.AppCompatActivity.invalidateOptionsMenu(AppCompatActivity.java:314) E/AndroidRuntime( 8319): at androidx.activity.ComponentActivity.invalidateMenu(ComponentActivity.java:553) E/AndroidRuntime( 8319): at androidx.activity.ComponentActivity$$ExternalSyntheticLambda0.run(Unknown Source:2) E/AndroidRuntime( 8319): at androidx.core.view.MenuHostHelper.addMenuProvider(MenuHostHelper.java:133) E/AndroidRuntime( 8319): at androidx.activity.ComponentActivity.addMenuProvider(ComponentActivity.java:531) E/AndroidRuntime( 8319): at androidx.fragment.app.FragmentActivity$HostCallbacks.addMenuProvider(FragmentActivity.java:736) E/AndroidRuntime( 8319): at androidx.fragment.app.FragmentManager.attachController(FragmentManager.java:2793) E/AndroidRuntime( 8319): at androidx.fragment.app.FragmentController.attachHost(FragmentController.java:117) E/AndroidRuntime( 8319): at androidx.fragment.app.FragmentActivity.lambda$init$3$androidx-fragment-app-FragmentActivity(FragmentActivity.java:140) E/AndroidRuntime( 8319): at androidx.fragment.app.FragmentActivity$$ExternalSyntheticLambda3.onContextAvailable(Unknown Source:2) E/AndroidRuntime( 8319): at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable(ContextAwareHelper.java:99) E/AndroidRuntime( 8319): at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:352) E/AndroidRuntime( 8319): at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:217) E/AndroidRuntime( 8319): at net.openid.appauth.RedirectUriReceiverActivity.onCreate(RedirectUriReceiverActivity.java:49) E/AndroidRuntime( 8319): at android.app.Activity.performCreate(Activity.java:8305) E/AndroidRuntime( 8319): at android.app.Activity.performCreate(Activity.java:8284) E/AndroidRuntime( 8319): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417) E/AndroidRuntime( 8319): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3626) E/AndroidRuntime( 8319): ... 12 more I/Process ( 8319): Sending signal. PID: 8319 SIG: 9 Lost connection to device. Exited (sigterm)
已尝试修改AndroidManifest.xml的android:theme属性,但问题未解决,求同时使用两个插件的方案。
解决方案
1. 为RedirectUriReceiverActivity指定AppCompat主题
在android/app/src/main/AndroidManifest.xml中,找到或添加net.openid.appauth.RedirectUriReceiverActivity的声明,明确指定AppCompat类型主题:
<activity android:name="net.openid.appauth.RedirectUriReceiverActivity" android:exported="true" android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
2. 确保全局应用主题继承自AppCompat
检查AndroidManifest.xml中<application>标签的android:theme属性,确保主题基于Theme.AppCompat:
<application ... android:theme="@style/Theme.MyApp">
对应res/values/styles.xml中的主题定义示例:
<style name="Theme.MyApp" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primary_dark</item> <item name="colorAccent">@color/accent</item> </style>
3. 清理重建项目
完成上述修改后,执行以下步骤确保生效:
- 运行
flutter clean清理缓存 - 运行
flutter pub get重新获取依赖 - 重新编译运行项目
原理说明
local_auth引入的AndroidX依赖会改变应用主题的继承链,导致flutter_appauth依赖的RedirectUriReceiverActivity无法自动匹配到AppCompat主题。通过直接为该Activity指定主题,或确保全局主题为AppCompat派生类,可以解决两者的兼容性冲突。
内容的提问来源于stack exchange,提问作者Kayin Leong
相关产品推荐
相关产品推荐

