简体   繁体   English

软键盘在颤振的 WebView 上停止工作 Android 12

[英]Soft keyboard stopped working in flutter's WebView on Android 12

I have a few flutter applications in production where the webview stopped working.我在生产中有一些 flutter 应用程序,其中 webview 停止工作。 webview_flutter fails to show the (soft) keyboard on Android 12 (API 31), no matter of what kind of input field is clicked.无论单击哪种输入字段, webview_flutter 都无法在 Android 12 (API 31) 上显示(软)键盘。 The error can be easily reproduced with the Android emulator when switching between Android 11 and 12. On Android 12 it fails with a exception like this:在 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 has an option to set the platform view mode . webview_flutter有一个设置平台视图模式的选项。 As described in theREADME the composition mode can be switched from Virtual displays to Hybrid composition .自述文件中所述,合成模式可以从Virtual displays切换到Hybrid composition This solves the problem, allows for full keyboard support and only requires Android SDK support 19 but comes with a drawback.这解决了问题,允许全键盘支持,并且只需要 Android SDK 支持 19 但有一个缺点。 The performance on Android 9 and lower is not as good as with the default virtual display mode. Android 9 及更低版本的性能不如默认虚拟显示模式。

To enable hybrid composition (copying webview's readme right now):要启用混合合成(现在复制 webview 的自述文件):

  1. Set minSdkVersion in android/app/build.gradleandroid/app/build.gradle中设置minSdkVersion
 android {
     defaultConfig {
         minSdkVersion 19
     }
 }
  1. Put if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView(); somewhere in your application eg main.dart or in your StatefulWidget 's initState() method.在您的应用程序中的某处,例如main.dart或您的StatefulWidgetinitState()方法。

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

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