[003]flutter webview加载h5

本文介绍了如何在Flutter应用中使用webview_flutter库加载H5页面,包括添加依赖、安装、配置权限、导入包、处理异常以及实现滑动监听和交互功能。针对iOS和Android的网络权限问题进行了详细说明。

webview_flutter library:https://pub.dev/packages/webview_flutter

A Flutter plugin that provides a WebView widget.

On iOS the WebView widget is backed by a WKWebView; 
On Android the WebView widget is backed by a WebView.

一个提供WebView小部件的Flutter插件。
在iOS上,WebView小部件由WKWebView支持;
在Android上,WebView小部件由WebView支持。
1.依赖

pubspec.yaml文件中添加依赖webview_flutter: ^0.3.10+2

dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2
  webview_flutter: ^0.3.10+2
2. 安装
// 运行如下命令
$ flutter pub get
3. 配置权限
  • 1、IOS[未验证:来自网络]

需要在Info.plist中添加io.flutter.embedded_views_preview

<key>io.flutter.embedded_views_preview</key>
<string>YES</string>
  • 2、Android

需要在AndroidManifest.xml中添加网络权限

<uses-permission android:name="android.permission.INTERNET" />
4. 导入包
import 'package:webview_flutter/webview_flutter.dart';
5. 使用webview加载
// new version
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() => runApp(new ECardApp());

class ECardApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'ecard',
      theme: new ThemeData(
        primarySwatch: Colors.yellow,
      ),
      home: new HomeWidget(),
    );
  }
}

class HomeWidget extends StatelessWidget {
 @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(
        title: Text('加载网络h5'),
      ),
      body: new WebView(
        initialUrl: 'h5 Url/',
      ),
    );
  }
}
6.run,ok

异常处理

IOS出现无法加载http请求的情况,Android在9.0之后也不支持http,所以需要添加信任。

1、IOS

info.plist中添加对HTTP的信任

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
2、Android
  • 2.1、清单文件AndroidManifest.xml的application标签里面设置networkSecurityConfig
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config">
         <!-- ... -->
         <!-- ... -->
    </application>
</manifest>

  • 2.2、在资源文件夹res/xml下面创建network_security_config.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>


todo
  • 缓存处理
  • 监听加载状态
  • flutter和原生app交互
  • 滑动监听

原文链接:flutter webview加载h5

### 概念介绍 #### Flutter Flutter 是 Google 推出的一个开源 UI 软件开发工具包,用于在 Android、iOS、Web、桌面(Windows、macOS、Linux)等平台上构建原生编译的应用程序。它使用 Dart 语言进行开发,通过其独特的渲染引擎直接绘制 UI,而不是依赖平台原生组件。这使得 Flutter 应用在不同平台上保持高度一致性,同时具备接近原生的性能表现。 #### WebView WebView 是一种嵌入式的浏览器组件,允许在原生应用中加载和显示网页内容。它基于平台提供的浏览器引擎(如 Android 的 WebView 控件使用的是 Chromium 内核),可以用来展示 HTML 页面、执行 JavaScript 代码,并与原生代码进行通信。WebView 通常用于需要展示网页内容或集成 Web 技术开发的混合应用中。 #### React Native(RN) React Native 是 Facebook 在 2015 年推出的一个开源框架,用于构建原生渲染的移动应用。它使用 JavaScript 作为开发语言,通过 JavaScript 桥接技术在运行时将代码编译为平台特定的原生组件(如 Android 的 View 和 iOS 的 UIView)。React Native 借鉴了 React 的组件化思想,并结合 Facebook 的 Flux 架构模式,使得开发者能够使用一套代码库同时支持 iOS 和 Android 平台。 #### HTML5(H5) HTML5 是 HTML(超文本标记语言)的最新版本,是 Web 开发的核心标准之一。它引入了多种新特性,如语义化标签、本地存储、多媒体支持(音频和视频标签)、Canvas 图形绘制、离线应用等。HTML5 通常与 CSS3 和 JavaScript 结合使用,用于构建响应式网页和跨平台 Web 应用。H5 开发通常依赖于 WebView 来在移动应用中展示。 --- ### 技术对比 #### 开发语言 - **Flutter** 使用 Dart 语言进行开发,Dart 是一种强类型的面向对象语言,支持 JIT(即时编译)和 AOT(提前编译)模式。 - **React Native** 使用 JavaScript,结合 JSX 语法进行组件开发。 - **WebView** 中的内容使用 HTML、CSS 和 JavaScript 构建。 - **HTML5** 本质上是网页技术的一部分,主要依赖 HTML5、CSS3 和 JavaScript。 #### 渲染机制 - **Flutter** 使用自有的高性能渲染引擎,直接绘制 UI 组件,不依赖平台原生控件,实现跨平台一致性。 - **React Native** 通过桥接机制调用原生组件,UI 渲染基于平台的原生视图,性能接近原生。 - **WebView** 使用平台内置的浏览器引擎渲染网页内容,性能受限于 WebView 的实现。 - **HTML5** 依赖浏览器或 WebView 来渲染页面,UI 表现受浏览器兼容性影响较大。 #### 性能表现 - **Flutter** 提供接近原生的性能,特别是在动画和复杂 UI 场景下表现优异。 - **React Native** 在大多数场景下性能良好,但在频繁更新 UI 或处理大量动画时,可能会受到桥接机制的影响。 - **WebView** 的性能通常不如原生或混合框架,特别是在涉及复杂交互或大量 DOM 操作时。 - **HTML5** 的性能依赖于浏览器或 WebView 的实现,通常适合内容展示类应用。 #### 开发体验 - **Flutter** 提供了热重载(Hot Reload)功能,开发者可以实时查看代码修改后的 UI 效果。 - **React Native** 也支持热加载,开发体验接近网页开发,适合熟悉 JavaScript 的开发者。 - **WebView** 和 **HTML5** 的开发体验与网页开发一致,适合前端开发者快速上手。 #### 适用场景 - **Flutter** 适合需要高性能、复杂交互和高度一致 UI 的跨平台应用。 - **React Native** 适合需要复用大量代码、快速迭代、对性能要求适中的移动应用。 - **WebView** 适合嵌入网页内容、展示富文本或集成 Web 技术开发的功能模块。 - **HTML5** 适合构建响应式网页、Web 应用或需要跨平台兼容的内容展示。 --- ### 示例:React Native 中 WebView 的使用 ```jsx import React from 'react'; import { WebView } from 'react-native-webview'; const MyWebView = () => { const onMessage = (event) => { console.log('接收到的来自于 HTML5 的消息:', event.nativeEvent.data); }; const webViewRef = React.useRef(null); return ( <WebView source={{ uri: 'file:///android_asset/index.html' }} style={{ marginTop: 0 }} ref={webViewRef} onMessage={onMessage} useWebKit={true} javaScriptEnabled={true} /> ); }; ``` 在上述代码中,React Native 通过 `WebView` 组件加载 HTML 文件,并通过 `onMessage` 方法接收来自 HTML 的消息。同时,可以通过 `postMessage` 方法从 React Native 向 HTML 发送消息。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值