【Flutter学习】基本组件之Webview组件

1.添加依赖

dependencies:
flutter_webview_plugin: ^0.2.1+2

2.导入库

import ‘import ‘package:flutter_webview_plugin/flutter_webview_plugin.dart‘; //导入前需要配置

3.属性

const WebviewScaffold({
Key key,
this.appBar,
@required this.url,
this.headers,//
this.withJavascript,//是否允许执行js代码
this.clearCache,//
this.clearCookies,//
this.enableAppScheme,//
this.userAgent,//
this.primary = true,//
this.persistentFooterButtons,//
this.bottomNavigationBar,//
this.withZoom,//是否允许网页缩放
this.withLocalStorage,//是否允许LocalStorage
this.withLocalUrl,//
this.scrollBar,//是否显示滚动条
this.supportMultipleWindows,//
this.appCacheEnabled,//
this.hidden = false,//
this.initialChild,//
this.allowFileURLs,//
this.resizeToAvoidBottomInset = false,//
this.invalidUrlRegex,//
this.geolocationEnabled//
})

4.使用方法  

FlutterWebviewPlugin 插件提供一个链接到唯一webview的单一实例,这样你就可以在app中的任何地方控制webview

import ‘package:flutter/material.dart‘;
import ‘package:flutter_webview_plugin/flutter_webview_plugin.dart‘;
import ‘package:http/http.dart‘ as http;

class Widget_WebView_Page extends StatefulWidget {
@override
 State<StatefulWidget> createState() {
   return Widget_WebView_State();
 }
}

class Widget_WebView_State extends State<Widget_WebView_Page> with SingleTickerProviderStateMixin {
 FlutterWebviewPlugin flutterWebviewPlugin = FlutterWebviewPlugin();
 var title = "WebView组件";
 var tabs;
 TabController controller;
 var choiceIndex = 0;

//获取h5页面标题
Future<String> getWebTitle() async {
  String script = ‘window.document.title‘;
  var title = await
  flutterWebviewPlugin.evalJavascript(script);
  setState(() {
   this.title = title;
   print(‘#################### $title‘);
  });
}

//获取h5页面标题
Future<String> getWebTitle2({String url}) async {
  var client = http.Client();
  client.get(url).then(   (response) {
      String title = RegExp( r"<[t|T]{1}[i|I]{1}[t|T]{1}[l|L]{1}[e|E]{1}(\s.*)?>([^<]*)</[t|T]{1}[i|I]{1}[t|T]{1}[l|L   ]{1}[e|E]{1}>").stringMatch(response.body);
      if (title != null) {
          title = title.substring(title.indexOf(‘>‘) + 1, title.lastIndexOf("<"));
      } else {
          title = "";
      }
     print("#################### " + title);
   }  ).catchError(
     (error) {
       print(error);
     }  ).whenComplete(client.close,);  }

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

/**
* 监听web页加载状态
*/
flutterWebviewPlugin.onStateChanged.listen((WebViewStateChanged webViewState) async {
// setState(() {
// title = webViewState.type.toString();
// });
  switch (webViewState.type) {
    case WebViewState.finishLoad:{
       handleJs();
       getWebTitle();    }       break;
    case WebViewState.shouldStart:
       break;
    case WebViewState.startLoad:
       break;
    case WebViewState.abortLoad:
       break;
  }
});

/**
* 监听页面加载url
*/
flutterWebviewPlugin.onUrlChanged.listen((String url) {
// getWebTitle(url: url);

// setState(() {
// title = url;
// });
});

/**
* 监听x轴滑动距离
* 好像没什么用
*/
// flutterWebviewPlugin.onScrollXChanged.listen((double offsetX) {
// title = offsetX.toString();
// });

// flutterWebviewPlugin.onScrollYChanged.listen((double offsetY) {
// title = offsetY.toString();
// });

tabs = <Widget>[
 Tab(
   child: GestureDetector(
      child: Text("刷新"),
      onTap: () {
       flutterWebviewPlugin.reload();
      },
   ),
),
Tab(
   child: GestureDetector(
     child: Text("返回"),
     onTap: () {
       flutterWebviewPlugin.goBack();
     },
   ),
),
Tab(
   child: GestureDetector(
     child: Text("加载指定url"),
     onTap: () {
       flutterWebviewPlugin.reloadUrl("https://www.360.com");
     },
   ),
),
];
controller =
   TabController(initialIndex: 0, length: tabs.length, vsync: this);
}

@override
Widget build(BuildContext context) {
return WebviewScaffold(
  url: "http://www.baidu.com",
  //默认加载地址
  appBar: AppBar(
   title: Text(title),
   backgroundColor: Colors.grey,
   leading: GestureDetector(
   child: Icon(Icons.arrow_back),
       onTap: () {
          flutterWebviewPlugin.close();
       },
   ),
   bottom: TabBar(
        tabs: tabs,
        controller: controller,
        indicatorColor: Colors.red,
   ),
   actions: <Widget>[],
  ),
   bottomNavigationBar: BottomNavigationBar(
     items: [
       BottomNavigationBarItem(
        icon: Icon(Icons.home),
        title: Text(
          "首页", /*style: TextStyle(color: Color(0xff333333)),*/        ),
        activeIcon: Icon(
          Icons.home,
          color: Color(0xffDE331F),
       // size: 30.0,
        ),
     backgroundColor: Color(0xffff0000),
   ),
  BottomNavigationBarItem(
       icon: Icon(Icons.devices_other),
       title: Text(
          "其他", /*style: TextStyle(color: Color(0xff333333)),*/       ),
       activeIcon: Icon(
        Icons.devices_other,
        color: Color(0xffDE331F),
      // size: 30.0,
       ),
       backgroundColor: Color(0xffff0000),
  ),
],
currentIndex: choiceIndex,
fixedColor: Color(0xffDE331F),
// iconSize: 30.0,
// type: BottomNavigationBarType.fixed,
onTap: (index) {
   if (index == 0) {
      setState(() {
           choiceIndex = 0;
           flutterWebviewPlugin.reloadUrl("https://www.qq.com/");
      });
    } else {
      setState(() {
           flutterWebviewPlugin.reloadUrl("https://www.alipay.com/");
           choiceIndex = 1;
      });
    }
  }
),
scrollBar: false,
withZoom: false,
);
}

 @override
 void dispose() {
  flutterWebviewPlugin.dispose();
  super.dispose();
 }

 void handleJs() {
  flutterWebviewPlugin.evalJavascript(
        "abc(${title}‘)"  ).then((result) {});
 }
}

五,webView其它用法

  • 隐藏webview:
    final flutterWebviewPlugin = new FlutterWebviewPlugin();
    flutterWebviewPlugin.launch(url, hidden: true);
  • 关闭webview:
    flutterWebviewPlugin.close();
  • 画一个内部矩形webview:
    final flutterWebviewPlugin = new FlutterWebviewPlugin();
    flutterWebviewPlugin.launch(url,
    fullScreen: false,
    rect: new Rect.fromLTWH(
     0.0,
     0.0,
     MediaQuery.of(context).size.width,
     300.0));

注意:webview并不存在于widget树中,所以你不能在webview中使用如snackbars, dialogs ...这些通知交互widget,更详细一些使用方法可以点击这里;

原文地址:https://www.cnblogs.com/lxlx1798/p/11371209.html

时间: 2024-08-29 20:18:53

【Flutter学习】基本组件之Webview组件的相关文章

WebView组件学习以及WebViewClient 的方法解释

在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件.利用WebView组件就可以做出款完全属于自己的手机浏览器,就想在windows上用IE内核做一个浏览器一样! 1.因为是浏览器,访问网络是必须的.所以,AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误. 2.设置浏览器是否运行网页上的javascript代码:

【React Native开发】React Native控件之WebView组件详解以及实例使用(22)

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50676379 本文出自:[江清清的博客] (一)前言 [好消息]个人网站已经上线运行,后面博客以及技术干货等精彩文章会同步更新,请大家关注收藏:http://www.lcode.org 今天我们一起来看一下WebView组件讲解以及使用实例 刚创建的React Native技术交流群(282693535),欢迎各位大牛,React Native技术爱好者加入交流!同

Ext JS学习第五天 Ext_window组件(一)

此文来记录学习笔记 •第一个组件:Ext.window.Window.对于组件,也就是Ext最吸引开发者的地方,那么我们要真正的使用Ext的组件,首先必须学会阅读API文档. –xtype:组件的别名 –Hierarchy 层次结构 –Inherited mixins 混入的类 –Requires 该组件需要使用的类 –configs:组件的配置信息 –properties:组件的属性 –methods:组件的方法 –events:组件的事件 •window组件常用属性和方法讲解: •confi

安卓开发复习笔记——WebView组件

我们专业方向本是JAVA Web,这学期突然来了个手机App开发的课设,对于安卓这块,之前自学过一段时间,有些东西太久没用已经淡忘了 准备随笔记录些复习笔记,也当做温故知新吧~ 1.什么是WebView? WebView(网络视图)能加载显示网页,可以将其视为一个浏览器,它使用了WebKit渲染引擎加载显示网页. 废话不多说,直接上代码 1.需要在xml布局文件中声明WebView组件 1 <WebView 2 android:id="@+id/webview" 3 androi

Ext JS学习第五天 Ext_window组件(二)

此文用来记录学习笔记 •上一讲我们已经学过了window的使用,那么在这将中,我们将结合然后把Ext中需要注意的地方,以及组建的使用给予介绍.indow做几个Web开发的经典示例. •ExtWeb实战300例: –例1:点击按钮打开一个window,window重复创建的问题 •重点分析:这个问题是初学者经常会犯错的地方,一般来说简单的代码不会产生此问题,但是如果以后代码复杂以后,这个问题如果发生调试起来会非常麻烦!! 附上栗子代码 1 Ext.onReady(function () { 2 3

Android学习之路——Android四大组件之activity(二)

上一篇讲了activity的创建和启动,这一篇,我们来讲讲activity的数据传递 activity之间的数据传递,这里主要介绍的是activity之间简单数据的传递,直接用bundle传递基本数据类型的数据.还有一种数据类型是parcelable和serialable 用bundle 传递数据有两种情况,这篇文章就分别从两个方面说明一下. 一.利用bundle传递基本数据类型 1.启动时传递数据,使用intent的put方法,将数据写入bundle中,然后startActivity(inte

SpringMVC学习(二)——SpringMVC架构及组件

相信大家通过前文的学习,已经对SpringMVC这个框架多少有些理解了.还记得上一篇文章中SpringMVC的处理流程吗? 这个图大致描述了SpringMVC的整个处理流程,这个流程图还是相对来说比较容易懂的,下面我会给出SpringMVC的框架结构图,这个图相对来说会更复杂,不过经过我细致入微的讲解,相信大家都可以深入理解. SpringMVC框架结构 SpringMVC框架结构如下图所示: 下面我会对SpringMVC框架结构作细致入微的讲解. 架构流程 用户发送请求至前端控制器Dispat

Android学习之路——Android四大组件之activity(一)

一.什么是Activity? Activity简单的说就是一个界面,我们在Android手机上看到的每一个界面就是一个activity. 二.Activity的创建 1.定义一个类继承activity,然后在清单文件manifest.xml文件的application节点下注册activity,这个activity就创建成功了. public class MyActivity extends Activity { } 2.清单文件注册activity <application android:a

《Hibernate学习笔记八》:组件映射

<Hibernate学习笔记八>:组件映射 前面介绍了一对一的单向.双向外键关联,例如,学生证和学生是一个一对一的关系.这篇博文主要是介绍下组件映射,即一个是另一个的一部分,例如,学生证的信息也可以作为学生信息的一部分,即在数据库中只存在学生一个表,而不是有学生和学生证两个表,并且这两个表中有一个一对一的关联关系. 如下: 有人或许会说,那我们就将学生和学生证的信息写在一个类中,则就不需要组件映射了,确实可以这样,但是,根据类的设计原则,我们一般都会将其设计为两个类,然后将学生证的信息作为一个