plo*_*oth 3 android webview flutter 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.
Run Code Online (Sandbox Code Playgroud)
UPD:由于webview_flutter:3.0.0不需要下面描述的操作中的第 2 步,因为开发人员将默认模式更改为Hybrid composition,这在 Android 12 上键盘没有问题。
原答案:
webview_flutter有一个设置平台视图模式的选项。如自述文件中所述,合成模式可以从 切换Virtual displays到Hybrid composition。这解决了问题,允许完整的键盘支持,并且只需要 Android SDK 支持 19,但有一个缺点。Android 9 及更低版本上的性能不如默认虚拟显示模式。
要启用混合组合(立即复制 webview 的自述文件):
minSdkVersion于android/app/build.gradle android {
defaultConfig {
minSdkVersion 19
}
}
Run Code Online (Sandbox Code Playgroud)
if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();您的应用程序中的某个位置,例如或您的方法main.dart中。StatefulWidgetinitState()| 归档时间: |
|
| 查看次数: |
6379 次 |
| 最近记录: |