Android设备Flutter Stripe支付Sheet点击粉色删除图标崩溃求助
问题描述
在Android设备上使用Flutter Stripe的PaymentSheet组件时,点击输入框的粉色删除图标会导致应用立即崩溃。该问题已被官方记录,说明10.0.0版本已修复此问题,但当前使用9.6.0版本,尝试升级到10.0.0时应用构建失败。
崩溃堆栈信息:
E/AndroidRuntime( 1596): FATAL EXCEPTION: main E/AndroidRuntime( 1596): Process: com.inspark.annuaire_entreprise, PID: 1596 E/AndroidRuntime( 1596): java.lang.NoSuchMethodError: No virtual method getEmojiStart(Ljava/lang/CharSequence;I)I in class Landroidx/emoji2/text/EmojiCompat; or its super classes (declaration of 'androidx.emoji2.text.EmojiCompat' appears in /data/app/~~10DiFKQl9tb4z5ybPgq0-g==/com.inspark.annuaire_entreprise-1moyKcUoju89JThTUqhVxg==/base.apk!classes19.dex) E/AndroidRuntime( 1596): at androidx.compose.foundation.text.StringHelpers_androidKt.findPrecedingBreak(StringHelpers.android.kt:24) E/AndroidRuntime( 1596): at androidx.compose.foundation.text.selection.BaseTextPreparedSelection.getPrecedingCharacterIndex(TextPreparedSelection.kt:150) E/AndroidRuntime( 1596): at androidx.compose.foundation.text.TextFieldKeyInput$process$2$3.invoke(TextFieldKeyInput.kt:131) E/AndroidRuntime( 1596): at androidx.compose.foundation.text.TextFieldKeyInput$process$2$3.invoke(TextFieldKeyInput.kt:129) E/AndroidRuntime( 1596): at androidx.compose.foundation.text.selection.TextFieldPreparedSelection.deleteIfSelectedOr(TextPreparedSelection.kt:397) E/AndroidRuntime( 1596): at androidx.compose.foundation.text.TextFieldKeyInput$process$2.invoke(TextFieldKeyInput.kt:129) E/AndroidRuntime( 1596): at androidx.compose.foundation.text.TextFieldKeyInput$process$2.invoke(TextFieldKeyInput.kt:106) E/AndroidRuntime( 1596): at androidx.compose.foundation.text.TextFieldKeyInput.commandExecutionContext(TextFieldKeyInput.kt:226) E/AndroidRuntime( 1596): at androidx.compose.foundation.text.TextFieldKeyInput.process-ZmokQxo(TextFieldKeyInput.kt:106) E/AndroidRuntime( 1596): at androidx.compose.foundation.text.TextFieldKeyInputKt$textFieldKeyInput$2$1.invoke-ZmokQxo(TextFieldKeyInput.kt:261) E/AndroidRuntime( 1596): at androidx.compose.foundation.text.TextFieldKeyInputKt$textFieldKeyInput$2$1.invoke(TextFieldKeyInput.kt:261) E/AndroidRuntime( 1596): at androidx.compose.ui.input.key.KeyInputNode.onKeyEvent-ZmokQxo(KeyInputModifier.kt:80) E/AndroidRuntime( 1596): at androidx.compose.ui.focus.FocusOwnerImpl.dispatchKeyEvent-ZmokQxo(FocusOwnerImpl.kt:193) E/AndroidRuntime( 1596): at androidx.compose.ui.platform.AndroidComposeView.dispatchKeyEvent(AndroidComposeView.android.kt:647) E/AndroidRuntime( 1596): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1993) E/AndroidRuntime( 1596): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1993) E/AndroidRuntime( 1596): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1993) E/AndroidRuntime( 1596): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1993) E/AndroidRuntime( 1596): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1993) E/AndroidRuntime( 1596): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1993) E/AndroidRuntime( 1596): at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:561) E/AndroidRuntime( 1596): at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1901) E/AndroidRuntime( 1596): at android.app.Activity.dispatchKeyEvent(Activity.java:4219) E/AndroidRuntime( 1596): at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:126) E/AndroidRuntime( 1596): at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:86) E/AndroidRuntime( 1596): at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:144) E/AndroidRuntime( 1596): at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:604) E/AndroidRuntime( 1596): at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:60) E/AndroidRuntime( 1596): at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:3413) E/AndroidRuntime( 1596): at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:448) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:6592) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6449) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5922) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5984) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5945) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6119) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5953) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6176) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5926) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5984) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5945) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5953) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5926) E/AndroidRuntime( 1596): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8942) E/AndroidRuntime( 1596): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8893) E/AndroidRuntime( 1596): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8854) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$ViewRootHandler.handleMessageImpl(ViewRootImpl.java:5682) E/AndroidRuntime( 1596): at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:5554) E/AndroidRuntime( 1596): at android.os.Handler.dispatchMessage(Handler.java:106) E/AndroidRuntime( 1596): at android.os.Looper.loopOnce(Looper.java:233) E/AndroidRuntime( 1596): at android.os.Looper.loop(Looper.java:344) E/AndroidRuntime( 1596): at android.app.ActivityThread.main(ActivityThread.java:8191) E/AndroidRuntime( 1596): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime( 1596): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584) E/AndroidRuntime( 1596): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034) I/Process ( 1596): Sending signal. PID: 1596 SIG: 9 Lost connection to device.
解决方案
方案1:强制统一emoji2依赖版本(解决升级Stripe 10.0.0后的构建失败)
从堆栈信息看,崩溃根源是androidx.emoji2.text.EmojiCompat缺少getEmojiStart方法,属于依赖版本不兼容问题。升级Stripe 10.0.0后,其依赖的Compose库要求更高版本的emoji2,而项目中存在低版本emoji2导致冲突。
在Android模块的build.gradle文件中添加以下代码,强制指定emoji2的统一版本:
configurations.all { resolutionStrategy { force 'androidx.emoji2:emoji2:1.2.0' force 'androidx.emoji2:emoji2-views:1.2.0' force 'androidx.emoji2:emoji2-views-helper:1.2.0' } }
版本号可根据当前项目Compose版本匹配,建议使用与Compose兼容的最新稳定版。
方案2:临时修复9.6.0版本的崩溃问题(若无法升级到10.0.0)
如果暂时无法解决Stripe 10.0.0的构建问题,可尝试以下临时方案避免崩溃:
- 通过Stripe的自定义配置,禁用PaymentSheet输入框删除图标的默认点击事件
- 在Android层面拦截删除按键事件,绕过触发崩溃的代码路径
注:此方案局限性较大,优先推荐解决版本升级问题。
方案3:排查Stripe 10.0.0升级的构建失败原因
若升级时存在具体构建错误,可按以下步骤排查:
- 执行
flutter pub outdated查看所有依赖的版本状态 - 执行
flutter pub upgrade --major-versions升级所有可升级的依赖 - 检查Android项目的
minSdkVersion是否符合Stripe 10.0.0的要求(Stripe 10.x通常要求minSdk≥21)
内容的提问来源于stack exchange,提问作者Selim Sayeh
相关产品推荐
相关产品推荐

