flutter android webview解决上传文件秒退问题
在项目中遇到的第二个坑: android webview 里点击会秒退。
出现这个问题的原因是,我使用的官方的webview_flutter插件没有针对这一功能做适配。而我在网上找到另一款flutter webview插件flutter webview plugin.这个插件针对android端webview上传文件的功能做了适配。
这里第一种思路是直接摒弃原版的webview_flutter插件。发现行不通,因为后者没有实现js channel和一些其他的功能。
第二种思路是把flutter webview plugin插件的文件上传部分的代码迁移到webview_flutter中。
插件是怎么调起来的
在代码迁移之前,首先说一下插件的代码是从哪开始走的。
在flutter工程的android/app/src/main/java/…/mainActivity里边有这一行代码
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//注册插件GeneratedPluginRegistrant.registerWith(this);}
在下面目录的GeneratedPluginRegistrant类里
FlutterWebviewPlugin.registerWith(registry.registrarFor("com.flutter_webview_plugin.FlutterWebviewPlugin"));WebViewFlutterPlugin.registerWith(registry.registrarFor("io.flutter.plugins.webviewflutter.WebViewFlutterPlugin"));
然后去插件文件夹里找registerWith这个静态方法。
public static void registerWith(Registrar registrar) {factory = new WebViewFactory(registrar.messenger(), registrar.view());registrar.platformViewRegistry().registerViewFactory("plugins.flutter.io/webview",factory);final WebViewFlutterPlugin instance = new WebViewFlutterPlugin(registrar.activity(),registrar.activeContext());registrar.addActivityResultListener(instance);FlutterCookieManager.registerWith(registrar.messenger());}
然后就是插件的内部逻辑了。
android webview 文件上传的思路
不论代码怎么变,Android webview文件上传始终是那个思路。
点击选择文件的时候,会调用 webviewClient 下的openFileChooser()(5.0及以上系统回调onShowFileChooser()),这个时候我们在openFileChooser方法中通过Intent打开系统相册或者支持该Intent的第三方应用来拿到选择文件的uri,最后在onActivityResult()中将选择的文件uri通过ValueCallback的onReceiveValue方法返回给WebView,然后通过js上传。
代码迁移
我在这里简单介绍一下代码迁移的思路方法。我贴出的代码直接拷贝可能不能用,因为在其他细节的地方我还做了一些类型的适配,在这里不一一介绍。在文章尾我会贴出我修改后的webview_flutter插件的代码,可以拿来直接用。
- 实现openFileChooer()方法:
在webview_flutter插件目录/plugins/webvi
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
