Программная клавиатура перестала работать в flutter’s WebView на Android 12

#android #flutter #webview #android-12

#Android #flutter #webview #android-12

Вопрос:

У меня есть несколько приложений flutter в производстве, где webview перестал работать. webview_flutter не показывает (программную) клавиатуру на Android 12 (API 31), независимо от того, какое поле ввода нажато. Ошибка может быть легко воспроизведена с помощью эмулятора Android при переключении между Android 11 и 12. На 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.
 

Ответ №1:

UPD: поскольку webview_flutter: 3.0.0, шаг 2 из описанных ниже действий не требуется, поскольку разработчики изменили режим по умолчанию на Hybrid composition , который не имеет проблем с клавиатурой на Android 12.

Оригинальный ответ: webview_flutter имеет возможность установить режим просмотра платформы. Как описано в README, режим композиции можно переключить с Virtual displays на Hybrid composition . Это решает проблему, обеспечивает полную поддержку клавиатуры и требует только поддержки Android SDK 19, но имеет недостаток. Производительность на Android 9 и ниже не так хороша, как в режиме виртуального отображения по умолчанию.

Чтобы включить гибридную композицию (копируя readme из webview прямо сейчас):

  1. Установите minSdkVersion в android/app/build.gradle
  android {
     defaultConfig {
         minSdkVersion 19
     }
 }
 
  1. Поместите if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView(); где-нибудь в вашем приложении, например main.dart , или в вашем StatefulWidget initState() методе.

Комментарии:

1. Не работает для меня, потому что: плагин «google_maps_flutter» требует более высокой версии Android SDK.

2. @ZeroCode вполне нормально указать более новую версию sdk 😉

3. Спасибо. Вы сэкономили мне несколько дней на устранении неполадок