Flutter webView的使用及与js交互

2022-04-11 18:33:33 浏览数 (1)

对于Flutter开发,使用webView显示h5页面也是非常常见的,网上也有很多相关帖子,刚好最近接触了,这里对此做个总结。主要介绍下目前Flutter常用的webView使用,以及与js的交互

Flutter常见的webView插件: webview_flutterflutter_webview_plugin 在iOS中底层调用的是WKWebView,在Android中底层调用的是WebView。

webview_flutter插件 的使用

  • 添加依赖 dependencies: webview_flutter: ^0.3.21
  • 拉取依赖库 flutter pub get
  • 导包 import 'package:webview_flutter/webview_flutter.dart';
代码语言:javascript复制
Widget build(BuildContext context) {
    return Container(
      child: WebView(
      initialUrl: url,
      javascriptMode: JavascriptMode.unrestricted,
      javascriptChannels: javascriptChannels1,
      gestureNavigationEnabled: true,
    ),
    );
  }

flutter_webview_plugin插件 的使用

  • 添加依赖 dependencies: flutter_webview_plugin: ^0.3.11
  • 拉取依赖库 flutter pub get
  • 导包 import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
代码语言:javascript复制
Widget build(BuildContext context) {
    return Container(
      child: WebviewScaffold(
        url: url,
        withJavascript: true,
        supportMultipleWindows: true,
        withLocalStorage: true,
        javascriptChannels: javascriptChannels,
      ),
    );
  }

注意:2个插件使用时,iOS需要在项目info.plist文件中加入如下配置

代码语言:javascript复制
<key>io.flutter.embedded_views_preview</key>
        <true/>

这个不添加 h5页面加载不出来

代码语言:javascript复制
<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

如果是http协议,需要配置这个

JS掉起Flutter互

做过原生webView交互的都知道,js和原生交互的处理方式,js掉起Flutter除了可以像js掉安卓、ios原生那样调用外,

  • JS掉起原生 js代码如下:
代码语言:javascript复制
 if (isIOS == false) {
    window.android.postStatus({
        message: "js调用了flutter",
    });
} else {
     window.webkit.messageHandlers.postStatus.postMessage({
        message: "js调用了flutter",
    });
}

还可以使用另外一种比较方便的方式调用。

代码语言:javascript复制
function flutterShowToast() {
    postStatus.postMessage("message from JS...");
  }

postStatus就是方法名,传递的参数可以是字符串,数据多可以使用json字符串,切记 方法名必须和接收处一致。

本文示例中的html js交互采用的是原生方式,不过建议大家使用后面这种js调用方式,安卓和iOS都统一,省钱了判断平台的麻烦。

  • Flutter代码写法
代码语言:javascript复制
_jsCallNativeChannel() {
    return <JavascriptChannel>[
      _jsCallNativeJavascriptChannel(context),
    ].toSet();
  }

  _jsCallNativeJavascriptChannel(BuildContext context) {
    return JavascriptChannel(
        name: "postStatus",
        onMessageReceived: (JavascriptMessage message) {
          print("Js call native :${message.message}");
        });
  }

JavascriptChannel即一个js调用Flutter的通道,可以有多个通道。name是方法名,和js端对应,回调了一个 JavascriptMessage 对象,接收来自 JS 的回调信息。目前这里边只有一个 message(String) 属性。只支持 String 类型的参数,数据过多的话可以考虑 JSON 的 String 类型参数

本demo完整的代码已上传github,地址在下面

代码语言:javascript复制
插件地址:
https://pub.dev/packages?q=webview_flutter ;
https://pub.dev/packages/flutter_webview_plugin
本文源码:
https://github.com/Qson8/flutter_webview_demo.git

0 人点赞