Flutter webview与网页通讯交互实现

 更新时间:2022年04月13日 15:11:58   作者:我也还在想  
最近要在Flutter项目的基础上加一个实时定位的功能,下面这篇文章主要给大家介绍了关于Flutter webview与网页通讯交互实现的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

前言

在app开发中我们有JSBridge来实现app和网页端通讯,现参考JSBridge实现了Flutter webview和网页端通讯。

预览

flutter

import 'package:ds_bridge/ds_bridge.dart';
class JsBridgeUtil {
  // 向H5调用接口
  static executeMethod(flutterWebViewPlugin, String jsonStr) async{
    DsBridge dsBridge = DsBridge(flutterWebViewPlugin);
    Result result = dsBridge.dispatch(jsonStr);
    if(result.method == 'share'){
      result.callBack('收到网页端share事件,内容为${result.data}并返回此文本给网页');
    }
    if(result.method == 'share1'){
      result.callBack('收到网页端share1事件');
    }
  }
}

网页

import 'dsbridge_flutter'
dsBridge.call('share', { name: 'woyehaizaixiang' }, function (res) {
  alert(res)
})

具体实现

flutter中使用ds_bridge

此包是flutter_webview_pluginwebview与网页交互的工具包,需要先添加flutter_webview_plugin组件,具体flutter_webview_plugin组件使用请前往官网查看 ,在添加flutter_webview_plugin组件后,添加ds_bridge组件

1.配置依赖包

dependencies:
    ds_bridge: ^0.0.1

2.在webview页面添加JavascriptChannel

webview.dart

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:yundk_app/routes/application.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
import '../../utils/JsBridgeUtil.dart';

class WebviewPage extends StatefulWidget {
  final String url;
  final VoidCallback backCallback;

  WebviewPage({
    Key key,
    @required this.url,
    this.backCallback,
  }) : super(key: key);

  @override
  _WebviewPageState createState() => _WebviewPageState();
}

class _WebviewPageState extends State<WebviewPage> {
  String _title = '';
  final flutterWebViewPlugin = FlutterWebviewPlugin();
  final Set<JavascriptChannel> jsChannels = [
    JavascriptChannel(
        name: 'DsBridgeApp',
        onMessageReceived: (JavascriptMessage msg) {
          String jsonStr = msg.message;
          JsBridgeUtil.executeMethod(FlutterWebviewPlugin(), jsonStr);
        }),
  ].toSet();

  StreamSubscription<String> _onUrlChanged;

  @override
  void initState() {
    super.initState();
    flutterWebViewPlugin.close();

    // 监听 url changed
    _onUrlChanged =
    flutterWebViewPlugin.onUrlChanged.listen((String url) async {

    });

    // 监听页面onload
    flutterWebViewPlugin.onStateChanged.listen((viewState) async {
      if (viewState.type == WebViewState.finishLoad) {
        flutterWebViewPlugin.evalJavascript('document.title').then((result) => {
          setState(() {
            _title = result;
          })
        });
      }
    });

  }

  @override
  void dispose() {
    _onUrlChanged.cancel();
    flutterWebViewPlugin.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: WebviewScaffold(
        appBar: new AppBar(
          leading: IconButton(
            hoverColor: Colors.transparent,
            highlightColor: Colors.transparent,
            icon: Icon(const IconData(0xe61b, fontFamily: 'IconFont'), color: Color(0xff333333), size: 18),
            onPressed: (){
              flutterWebViewPlugin.close();
              Application.router.pop(context);
            },
          ),
          title: new Text(
            _title,
            style: TextStyle(color: Color(0xff333333), fontSize: 17),
          ),
          actions: [
            new IconButton(
              icon: new Icon(
                Icons.refresh_outlined,
                color: Color(0xff333333),
                size: 20
              ),
              onPressed: () {
                flutterWebViewPlugin.reload();
              }
            ),
          ],
          centerTitle: true,
          elevation: 0,
        ),
        url: widget.url,
        javascriptChannels: jsChannels,
        mediaPlaybackRequiresUserGesture: false,
        withZoom: true,
        withLocalStorage: true,
        hidden: true,
      )
    );
  }
}

3.在JsBridgeUtil类中

utils/JsBridgeUtil.dart

import 'package:ds_bridge/ds_bridge.dart';
class JsBridgeUtil {
  // 向H5调用接口
  static executeMethod(flutterWebViewPlugin, String jsonStr) async{
    DsBridge dsBridge = DsBridge(flutterWebViewPlugin);
    Result result = dsBridge.dispatch(jsonStr);
    if(result.method == 'share'){
      result.callBack('收到网页端share事件,内容为${result.data}并返回此文本给网页');
    }
    if(result.method == 'share1'){
      result.callBack('收到网页端share1事件');
    }
  }
}

网页端使用dsbridge_flutter

此插件为网页端插件,配合flutter端ds_bridge一起使用

1.安装

npm install dsbridge_flutter

2.使用

import 'dsbridge_flutter'
dsBridge.call(<String> method, <Object> data, <Function> callback)

3.例子

import 'dsbridge_flutter'
dsBridge.call('share', { name: 'woyehaizaixiang' }, function (res) {
  alert(res)
})

总结

本文参考JSBridge实现了Flutter webview和网页端交互。具体用到的插件有Flutter端flutter_webview_pluginds_bridge、网页端有dsbridge_flutter

到此这篇关于Flutter webview与网页通讯交互实现的文章就介绍到这了,更多相关Flutter webview与网页通讯内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android通过自定义Activity实现悬浮的Dialog详解

    Android通过自定义Activity实现悬浮的Dialog详解

    这篇文章主要给大家介绍了关于Android通过自定义Activity实现悬浮的Dialog的相关资料,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考学习价值,感兴趣的朋友们下面来一起看看吧。
    2017-05-05
  • Android采取BroadcastReceiver方式自动获取验证码

    Android采取BroadcastReceiver方式自动获取验证码

    这篇文章主要介绍了Android采取BroadcastReceiver方式自动获取验证码,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android获取手机位置的实现代码

    Android获取手机位置的实现代码

    这篇文章主要为大家详细介绍了Android获取手机位置的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 详解Android 扫描条形码(Zxing插件)

    详解Android 扫描条形码(Zxing插件)

    本篇文章主要对Android 扫描条形码(Zxing插件)进行实例解析,相信对大家的学习会有很好的帮助,需要的朋友一起来看下吧
    2016-12-12
  • 安卓逆向案例分析之蝉妈妈sign破解

    安卓逆向案例分析之蝉妈妈sign破解

    这篇文章主要为大家介绍了安卓逆向案例分析蝉妈妈sign破解的方式讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • 怎样才能导入别人的android项目不再报错

    怎样才能导入别人的android项目不再报错

    每次看到好的项目都想拿过来看看源码,可是导入以后各种报错怎么办?源码有问题吗?有这种可能,但更多的可能性是你没有正确导入这个项目
    2021-08-08
  • Android中Fragment的解析和使用详解

    Android中Fragment的解析和使用详解

    现在Fragment的应用真的是越来越广泛了,之前Android在3.0版本加入Fragment的时候,主要是为了解决Android Pad屏幕比较大,空间不能充分利用的问题,但现在即使只是在手机上,也有很多的场景可以运用到Fragment了,这篇文章给大家介绍了Android中Fragment的解析和使用。
    2016-11-11
  • Android屏幕锁屏弹窗的正确姿势DEMO详解

    Android屏幕锁屏弹窗的正确姿势DEMO详解

    本文给大家分享android屏幕锁屏弹窗的正确姿势DEMO详解,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-09-09
  • 详解Android 硬布局item的高级写法

    详解Android 硬布局item的高级写法

    这篇文章主要介绍了详解Android 硬布局item的高级写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 浅析Android手机卫士之抖动输入框和手机震动

    浅析Android手机卫士之抖动输入框和手机震动

    这篇文章主要介绍了浅析Android手机卫士之输入框抖动和手机震动的相关资料,需要的朋友可以参考下
    2016-04-04

最新评论