IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter加载H5与js交互 -> 正文阅读

[移动开发]Flutter加载H5与js交互

3. webview_flutter(Null safety)

在这里插入图片描述

(1)描述:嵌入H5页面及与js交互

(2)适合平台:ANDRIOD、IOS

(3)使用

a. 判断页面是否加载完
import 'dart:io';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_base_framework/flutter_base_framework.dart';

import 'package:webview_flutter/webview_flutter.dart';

class TestWebPage extends StatefulWidget {
  @override
  TestWebPageState createState() => TestWebPageState();
}

class TestWebPageState extends State<TestWebPage> {

  WebViewController _controller;
  bool isLoading = true;  // 设置加载状态

  @override
  void initState() {
    super.initState();
    // Enable hybrid composition.
    if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
  }

  @override
  Widget build(BuildContext context) {
    return AnnotatedRegion<SystemUiOverlayStyle>(
        value: SystemUiOverlayStyle.dark,
        child: Scaffold(
            body: Container(
                width: double.infinity,
                height: double.infinity,
                child: Stack(
                  children: [
                    Padding(
                      padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
                      child: WebView(
                        initialUrl: '需要加载的H5页面',
                        javascriptMode: JavascriptMode.unrestricted,
                        onWebViewCreated: (WebViewController webViewController) {
                          _controller = webViewController;
                        },
                        navigationDelegate: (NavigationRequest request) {
                          setState(() {
                            isLoading = true; // 开始访问页面,更新状态
                          });

                          return NavigationDecision.navigate;
                        },
                        onPageFinished: (String url) {
                          setState(() {
                            isLoading = false; // 页面加载完成,更新状态
                          });
                        }
                      ),
                    ),
                    isLoading /// 根据加载状态来展示页面
                      ? Container(
                        child: Center(
                          child: CircularProgressIndicator(),
                        ),
                      )
                      : Container(),
                  ],
                )
            )
        )
    );
  }
}
b. Flutter调用JS方法

js部分

function fromFlutterMessage (message){
  document.getElementById ("fromFlutter").innerHTML = message;
  return true;
}

Flutter部分

/// 这里的_controller和上边是连起来的

_controller.evaluateJavascript("fromFlutterMessage('这里是来自Flutter的信息')").then((value) => print("发送成功"));
c. JS调用Flutter方法

Flutter部分

///这个是WebView的属性,所以要和WebView结合

javascriptChannels: <JavascriptChannel>[
  JavascriptChannel(
    name: "fromJavaScriptMessage",
    onMessageReceived: (JavascriptMessage message) {
      print(message.message);
    }
  ),
].toSet(),

js部分

function sendMessage (message) {
  fromJavaScriptMessage.postMessage(message); /// 这里是关键,方法名要相同
  document.getElementById ("toFlutter").innerHTML = message;
}

(4) 完整代码

HTML部分

<!DOCTYPE html>
<html lang="en">
  <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>html demo</title>
  </head>
  <body>
    <div id="fromFlutter"><span>Flutter发送过来的消息是: </span></div>
    <div id="toFlutter"><span>我发送给Flutter的消息是:</span></div>
    <button onclick="sendMessage('这里是来自JavaScript的方法')">sendMessageToFlutter</button>
  </body>
  <script>
    <!-- 这个方法是用来给Flutter调用的(即:Flutter调用js方法)-->
      function fromFlutterMessage (message){
      document.getElementById ("fromFlutter").innerHTML = message;
      return true;
    }

    <!-- 这个方法是用来发送一个消息给Flutter的(即:js调用Flutter方法)-->
      function sendMessage (message ) {
      MessageDeal.postMessage(message);
      document.getElementById ("toFlutter").innerHTML = message;
    }
  </script>
</html>

Flutter部分

/// 在a部分的基础上加了接收js方法的参数,可直接覆盖上边WebView组件

WebView(
  initialUrl: '需要加载的H5页面',
  javascriptMode: JavascriptMode.unrestricted,
  onWebViewCreated: (WebViewController webViewController) {
    _controller = webViewController;
  },
  navigationDelegate: (NavigationRequest request) {
    setState(() {
      isLoading = true; // 开始访问页面,更新状态
    });

    return NavigationDecision.navigate;
  },
  onPageFinished: (String url) {
    setState(() {
      isLoading = false; // 页面加载完成,更新状态
    });
    Future.delayed(Duration(seconds: 1), (){
      _controller.evaluateJavascript("showMessage('你好呀')").then((value) => print("发送成功"));
    });
  },
  javascriptChannels: <JavascriptChannel>[
    JavascriptChannel(
      name: "MessageDeal",
      onMessageReceived: (JavascriptMessage message) {
        print(message.message);
      }
    ),
  ].toSet(),
)
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:27:50  更:2021-08-28 09:27:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/31 6:31:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码