美文网首页
Flutter 部分安卓手机 Android12 软键盘无法正常

Flutter 部分安卓手机 Android12 软键盘无法正常

作者: SJY沙沙沙 | 来源:发表于2022-04-13 17:03 被阅读0次

    遇到一个很奇怪的问题,flutter在自己的手机上,textfield可以正常获取焦点,但是软键盘无法正常弹出。手机型号是realMe ,系统是12。试了其他的品牌的手机,均可以正常弹出软键盘。
    异常日志:W/InputMethodManager: Ignoring showSoftInput() as view=io.flutter.embedding.android.FlutterView is not served.

    最终解决方案

    在Flutter Android工程包的MainActivity增加如下代码

    @Override
        protected void onResume() {
            super.onResume();
            FlutterView flutterView = findViewById(FLUTTER_VIEW_ID);
            flutterView.requestFocus();
        }
    

    其他

    Flutter软键盘异常的问题很多,我的解决方案只是针对我遇到的报错,有些其他的原因,也会导致软键盘异常。比如未开启硬件加速,或者webview软键盘不弹出,都是其他的解决方案。

    问题排查回顾

    首先看了打印的异常日志:

    W/InputMethodManager: Ignoring showSoftInput() 
    as view=io.flutter.embedding.android.FlutterView
     is not served.
    

    从日志来看,貌似显示软键盘的方法没有执行成功。
    于是进入InputMethodManager查看源码:

     if (!hasServedByInputMethodLocked(view)) {
                    Log.w(TAG, "Ignoring showSoftInput() as view=" + view + " is not served.");
                    return false;
                }
    
    /**
         * Returns {@code true} when the given view has been served by Input Method.
         */
        private boolean hasServedByInputMethodLocked(View view) {
            final View servedView = getServedViewLocked();
            return (servedView == view
                    || (servedView != null && servedView.checkInputConnectionProxy(view)));
        }
    

    结合源码我推测,显示软键盘没有成功送达到FlutterView。我估计问题出在FlutterView,也许FlutterView 失焦了。
    那么FlutterView 是什么呢?这边我就不赘述了,感兴趣的可以自己搜索一下。
    首先得获取到FlutterView,
    进入FlutterActivitya源码

    /**
       * The ID of the {@code FlutterView} created by this activity.
       *
       * <p>This ID can be used to lookup {@code FlutterView} in the Android view hierarchy. For more,
       * see {@link android.view.View#findViewById}.
       */
      public static final int FLUTTER_VIEW_ID = ViewUtils.generateViewId(0xF1F2);
    

    可以通过FLUTTER_VIEW_ID获取FlutterView

    @Override
        protected void onResume() {
            super.onResume();
            FlutterView flutterView = findViewById(FLUTTER_VIEW_ID);
            flutterView.requestFocus();
        }
    

    于是我就在想通过,主动给FlutterView 设置焦点,尝试之后,软键盘正常了。

    相关文章

      网友评论

          本文标题:Flutter 部分安卓手机 Android12 软键盘无法正常

          本文链接:https://www.haomeiwen.com/subject/rypasrtx.html