android - 软键盘在 Android 12 上的 flutter WebView 中停止工作

标签 android flutter webview android-12

我在生产中有几个 flutter 应用程序,其中 webview 停止工作。 webview_flutter无论单击哪种输入字段,都无法在 Android 12 (API 31) 上显示(软)键盘。在 Android 11 和 12 之间切换时,可以使用 Android 模拟器轻松重现该错误。在 Android 12 上,它失败并出现如下异常:

[        ] V/InputMethodManager(10400): b/117267690: Display ID mismatch found. ViewRootImpl displayId=1 InputMethodManager displayId=0. Use the right InputMethodManager instance to avoid performance overhead.
[        ] V/InputMethodManager(10400): java.lang.Throwable
[        ] V/InputMethodManager(10400):     at android.view.inputmethod.InputMethodManager.getFallbackInputMethodManagerIfNecessary(InputMethodManager.java:549)
[        ] V/InputMethodManager(10400):     at android.view.inputmethod.InputMethodManager.restartInput(InputMethodManager.java:1843)
[        ] V/InputMethodManager(10400):     at org.chromium.content.browser.input.ImeAdapterImpl.H(chromium-TrichromeWebViewGoogle6432.apk-stable-447211487:4)
[        ] V/InputMethodManager(10400):     at org.chromium.content.browser.input.ImeAdapterImpl.updateState(chromium-TrichromeWebViewGoogle6432.apk-stable-447211487:30)
[        ] V/InputMethodManager(10400):     at android.os.MessageQueue.nativePollOnce(Native Method)
[        ] V/InputMethodManager(10400):     at android.os.MessageQueue.next(MessageQueue.java:335)
[        ] V/InputMethodManager(10400):     at android.os.Looper.loopOnce(Looper.java:161)
[        ] V/InputMethodManager(10400):     at android.os.Looper.loop(Looper.java:288)
[        ] V/InputMethodManager(10400):     at android.app.ActivityThread.main(ActivityThread.java:7842)
[        ] V/InputMethodManager(10400):     at java.lang.reflect.Method.invoke(Native Method)
[        ] V/InputMethodManager(10400):     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
[        ] V/InputMethodManager(10400):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
[        ] V/InputMethodManager(10400): b/117267690: Display ID mismatch found. ViewRootImpl displayId=1 InputMethodManager displayId=0. Use the right InputMethodManager instance to avoid performance overhead.
[        ] V/InputMethodManager(10400): java.lang.Throwable
[        ] V/InputMethodManager(10400):     at android.view.inputmethod.InputMethodManager.getFallbackInputMethodManagerIfNecessary(InputMethodManager.java:549)
[        ] V/InputMethodManager(10400):     at android.view.inputmethod.InputMethodManager.showSoftInput(InputMethodManager.java:1625)
[        ] V/InputMethodManager(10400):     at android.view.inputmethod.InputMethodManager.showSoftInput(InputMethodManager.java:1617)
[        ] V/InputMethodManager(10400):     at sH.d(chromium-TrichromeWebViewGoogle6432.apk-stable-447211487:3)
[        ] V/InputMethodManager(10400):     at org.chromium.content.browser.input.ImeAdapterImpl.L(chromium-TrichromeWebViewGoogle6432.apk-stable-447211487:20)
[        ] V/InputMethodManager(10400):     at org.chromium.content.browser.input.ImeAdapterImpl.updateState(chromium-TrichromeWebViewGoogle6432.apk-stable-447211487:32)
[        ] V/InputMethodManager(10400):     at android.os.MessageQueue.nativePollOnce(Native Method)
[        ] V/InputMethodManager(10400):     at android.os.MessageQueue.next(MessageQueue.java:335)
[        ] V/InputMethodManager(10400):     at android.os.Looper.loopOnce(Looper.java:161)
[        ] V/InputMethodManager(10400):     at android.os.Looper.loop(Looper.java:288)
[        ] V/InputMethodManager(10400):     at android.app.ActivityThread.main(ActivityThread.java:7842)
[        ] V/InputMethodManager(10400):     at java.lang.reflect.Method.invoke(Native Method)
[        ] V/InputMethodManager(10400):     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
[        ] V/InputMethodManager(10400):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
[        ] W/InputMethodManager(10400): Ignoring showSoftInput() as view=com.pichillilorenzo.flutter_inappwebview.in_app_webview.InAppWebView{c5bb4f2 VFEDHVCL. .F...... 0,0-1080,1911} is not served.

最佳答案

更新:webview_flutter:3.0.0不需要下面描述的操作的第 2 步,因为开发人员将默认模式更改为混合组合,这在 Android 12 上的键盘上没有问题。

原回答: webview_flutter有一个选项可以设置 platform view mode .如 README 中所述组合模式可以从Virtual displays切换到Hybrid composition。这解决了问题,允许全键盘支持并且只需要 Android SDK 支持 19 但有一个缺点。在 Android 9 及更低版本上的性能不如默认虚拟显示模式。

启用混合组合(立即复制 webview 的自述文件):

  1. android/app/build.gradle中设置minSdkVersion
 android {
     defaultConfig {
         minSdkVersion 19
     }
 }
  1. if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView(); 放在应用程序的某处,例如main.dart 或在您的 StatefulWidgetinitState() 方法中。

关于android - 软键盘在 Android 12 上的 flutter WebView 中停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70212256/

相关文章:

android - Frameloader 获取额外的 UA 字符串 - UAProfURL

android - 如何使网页 View 与其内容一样大?

java - Android 应用程序在请求 HttpResponse<JsonNode> 时崩溃

java - 通过代码以 dp 为单位设置 View 的高度?

flutter - Flutter中dio的全局配置(拦截器)

firebase - Flutter + Firestore 错误 : The method '[]' can't be unconditionally invoked because the receiver can be 'null'

Cocoa webview在没有内容的区域忽略鼠标事件

java - AlarmManager 服务始终每分钟运行一次

android - Intent.createChooser() 显示样式?

flutter - BackDropFilter不运行( flutter )