美文网首页
flutter使用插件时可能会遇到的问题

flutter使用插件时可能会遇到的问题

作者: EurekaFlutter | 来源:发表于2019-07-23 14:46 被阅读0次
    • 使用 flutter_webview_plugin 0.3.4
      使用flutter_webview_plugin 这个插件时
      如果你项目 配置了 android:sharedUserId="android.uid.system"
      就会遇到 webview打开不了的情况,以下是解决方案 放在插件源码中 创建webview之前即可。
        private void hookWebView(){
           int sdkInt = Build.VERSION.SDK_INT;
            try {
                Class<?> factoryClass = Class.forName("android.webkit.WebViewFactory");
                Field field = factoryClass.getDeclaredField("sProviderInstance");
                field.setAccessible(true);
                Object sProviderInstance = field.get(null);
                if (sProviderInstance != null) {
                    return;
                }
                Method getProviderClassMethod;
                if (sdkInt > 22) {
                    getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass");
                } else if (sdkInt == 22) {
                    getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass");
                } else {
                    return;
                }
                getProviderClassMethod.setAccessible(true);
                Class<?> factoryProviderClass = (Class<?>) getProviderClassMethod.invoke(factoryClass);
                Class<?> delegateClass = Class.forName("android.webkit.WebViewDelegate");
                Constructor<?> delegateConstructor = delegateClass.getDeclaredConstructor();
                delegateConstructor.setAccessible(true);
                if (sdkInt < 26) {//低於Android O版本
                    Constructor<?> providerConstructor = factoryProviderClass.getConstructor(delegateClass);
                    if (providerConstructor != null) {
                        providerConstructor.setAccessible(true);
                        sProviderInstance = providerConstructor.newInstance(delegateConstructor.newInstance());
                    }
                } else {
                    Field chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD");
                    chromiumMethodName.setAccessible(true);
                    String chromiumMethodNameStr = (String) chromiumMethodName.get(null);
                    if (chromiumMethodNameStr == null) {
                        chromiumMethodNameStr = "create";
                    }
                    Method staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass);
                    if (staticFactory != null) {
                        sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance());
                    }
                }
    
                if (sProviderInstance != null) {
                    field.set("sProviderInstance", sProviderInstance);
                } else {
    
                }
            } catch (Exception e) {
    
            }
    
        }
    
    

    相关文章

      网友评论

          本文标题:flutter使用插件时可能会遇到的问题

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