谷歌创立Flutter是为了简化咱们创立应用程序的方式,使咱们的应用程序能够在不同的平台上运转,而不需求移植代码或重写咱们已有的应用程序。

要做到这一点并不简单,由于每个原生操作系统都有其共同之处,而且数量很多。谷歌不可能支撑全部的系统。所以,谷歌让Flutter变得可装备,其方式是插件能够由其他开发者开发。

现在,咱们有一个常见的小部件是WebView小部件。这个WebView小组件答应咱们加载网页。

当咱们需求时,如安在Flutter中运用这个同样的部件?flutter.dev为咱们处理了这个问题。他们为此开发了一个Flutter插件:它就是webview_flutter

什么是Flutter WebView?

webview_flutter 是一个Flutter插件,它在Android和iOS上提供了一个WebView小部件。这个插件是用来在Android和iOS设备上显现网页的。

在这篇文章中,咱们将学习如安在Flutter项目中运用webview_flutter

咱们将学习怎么运用webview_flutter 插件从其URL或本地源加载网页。

要求

咱们将树立一个Flutter项目,所以咱们需求在咱们的机器上现已装置了一些东西。

Flutter

这是一个Flutter SDK,用于运转和编译Flutter项目。请到Flutter的文档中根据您的操作系统选择Flutter SDK。

  • Windows
  • macOS
  • Linux
  • Chrome OS

这些链接包括如安在您的机器上装置Flutter SDK的说明。装置完结后,保证flutter 在您的大局途径中。运转flutter --help ,测验Flutter SDK是否在您的机器上装置并被大局拜访。

VS代码

VS Code是微软为咱们带来的一个强壮的现代代码编辑器。它有一个扩展,能够协助您在VS Code中轻松地运用Flutter。在您的VS Code中装置Flutter的扩展。

安卓作业室

假如您想在 Android 中运转和测验您的应用程序,那么您需求在您的机器上装置 Android Studio。然后,咱们需求装置 Flutter 和 Dart 插件。

  • Flutter插件
  • Dart插件

保证全部都已装置并运转。在下一节,咱们将设置一个Flutter项目。

设置您的Flutter项目

现在,咱们将创立一个Flutter项目。咱们将运用flutter CLI东西来完结这项作业。
咱们的Flutter项目的名称将是webviewprj 。运转下面的指令。

flutter create webviewprj

Flutter将在文件夹webviewprj 中创立一个项目,然后装置依靠性。
在VS Code中翻开这个项目。假如你不运用VS Code,你能够在终端完结全部,但你必须在你喜欢的代码编辑器中翻开这个项目。

cd webviewprj

假如你运用的是VS Code,就不需求做上面的作业。只要在顶部菜单中的 “查看”,点击 “终端”,就能够翻开VS Code的集成终端。

增加webview_flutter 依靠性

接下来,咱们将增加webview_flutter 依靠联系到咱们的项目。

在你的项目根目录下翻开pubspec.yaml 文件,并增加以下几行。

dependencies:
  flutter:
    sdk: flutter
  webview_flutter:

保存pubspec.yaml 文件将导致VS Code装置该依靠联系。假如您没有运用VS Code,在您的终端运转以下指令来装置webview_flutter 依靠联系。

flutter pub get webview_flutter

flutter pub 包括办理Flutter软件包的指令。

flutter pub get 在Flutter项目中获取包。在本例中,它在咱们的Flutter项目中获取webview_flutter 包。

接下来,咱们设置webview_flutter 插件所需的最小SDK版别。在你的项目中翻开android/app/build.gradle ,并在android → defaultConfig 部分增加以下装备代码。

android {
    defaultConfig {
        minSdkVersion 19
    }
}

webview_flutter 从Android v19向上到最新的Android版别都能够运用。

运用webview_flutter

webview_flutter 输出一个WebView 类。这个类启动并创立一个新的Web视图,并在WebView小部件内烘托设定的网页(经过其URL)。WebView能够运用一个WebViewController ,一旦WebView被创立,它就被传递给onWebViewCreated 回调。
为了烘托WebView widget,咱们需求导入webview_flutter 包。

import 'package:webview_flutter/webview_flutter.dart';

然后,咱们像这样烘托WebView widget。

WebView(
    initialUrl: 'https://medium.com'
);

这将加载页面 [https://medium.com](https://medium.com)并在WebView widget中烘托。WebView 小组件将出现 [https://medium.com](https://medium.com)就像浏览器会烘托页面相同。WebView 传递给initialUrl 的参数告诉WebView 要加载和烘托的网页的URL。
还有其他参数,咱们能够传递给WebView 。让咱们看看下面的内容。

留意,下面的参数和它们的描述是从WebView类库文档中摘录的。

  • onWebViewCreated: 这是一个函数,一旦网络视图被创立就会被调用。
  • initialUrl: 这是一个字符串,用来保存网页的URL,以便在WebView上加载和出现。
  • javascriptMode: 这是设置WebView中是否启用了JavaScript。
  • javascriptChannels: 在WebView中运转的JavaScript代码可用的JavascriptChannels
  • navigationDelegate: 一个决定怎么处理导航动作的托付函数
  • onPageStarted :当一个页面开端加载时被调用。
  • onPageFinished :当页面加载结束后被调用。
  • onProgress :当一个页面正在加载时被调用。
  • debuggingEnabled: 操控是否启用WebView的调试。默许情况下,它被设置为false
  • gestureNavigationEnabled: 一个布尔值,表明水平滑动手势是否会触发后退式列表导航。默许情况下,它被设置为false
  • allowsInlineMediaPlayback: 操控iOS上是否答应HTML5视频的内联播映。这个字段在Android上被疏忽,由于Android默许答应。它的默许值是false

留意,javascriptModeautoMediaPlaybackPolicy 参数不能为空。

创立小组件页面

现在,咱们将在咱们的应用程序中创立两个widget页面:HomePageWebViewPageHomePage 页面将容纳两个按钮。每个按钮被点击后将翻开WebViewPage 页面。这个WebViewPage 页面将烘托一个WebView ,将网页的URL传递给WebView widget。

让咱们来创立它们。现已,Flutter为咱们生成了一些代码。除了MyApp widget,咱们将取消其他widget。
翻开lib/main.dart 文件,编辑成以下代码。

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'dart:io';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage()
    );
  }
}

请看,咱们在MyApp widget中烘托HomePage 。这使得HomePage 在应用程序被翻开时出现。

让咱们对HomePage widget进行编码。

class HomePage extends StatelessWidget {
  void _handleURLButtonPress(BuildContext context, String url, String title) {
    Navigator.push(context,
        MaterialPageRoute(builder: (context) => WebViewPage(url, title)));
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("WebView Flutter Example"),
      ),
      body: Center(
          child: Column(
        children: [
          MaterialButton(
            color: Colors.blue,
            child: Text(
              "Open pub.dev",
              style: TextStyle(color: Colors.white70, fontWeight: FontWeight.bold),
            ),
            onPressed: () {
              _handleURLButtonPress(
                  context, "https://pub.dev", "pub.dev");
            },
          ),
          MaterialButton(
            color: Colors.blue,
            child: Text(
              "Open Medium.com",
              style: TextStyle(color: Colors.white70, fontWeight: FontWeight.bold),
            ),
            onPressed: () {
              _handleURLButtonPress(
                  context, "https://medium.com", "Medium.com");
            },
          ),
        ],
      )),
    );
  }
}

看,这个HomePage 烘托了两个按钮MaterialButton 。每个按钮都被设置为在点击时调用函数_handleURLButtonPress

第一个按钮,Open pub.dev ,调用_handleURLButtonPress ,经过context"https://pub.dev" ,和"pub.dev""https://pub.dev" 是由WebView 加载和烘托的网页的URL。"pub.dev" 将是AppBar 的标题WebViewPage

第二个按钮,Open Medium.com ,将调用函数_handleURLButtonPress ,参数context[https://medium.com.com](https://medium.com.com)(WebView widget将加载和烘托的网页URL), 和Medium.com (WebViewPage 页面的标题)。

函数_handleURLButtonPress 启动了WebViewPage widget页面。它将把网页的URL和标题传递给WebViewPage

让咱们对WebViewPage widget进行编码。

class WebViewPage extends StatefulWidget {
  final String url;
  final String title;
  WebViewPage(this.url, this.title);
  @override
  WebViewPageState createState() =>
      WebViewPageState(this.url, this.title);
}
class WebViewPageState extends State<WebViewPage> {
  final String url;
  final String title;
  WebViewPageState(this.url, this.title);
  @override
  void initState() {
    super.initState();
    // Enable hybrid composition.
    if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(this.title),
        ),
        body: Column(children: [
          Expanded(
              child: WebView(
                  initialUrl: this.url,
                  javascriptMode: JavascriptMode.unrestricted
              )
          )
        ])
    );
  }
}

WebViewPage 是一个有状态的部件,而WebPageStateWebViewPage 的逻辑和内部状态。

WebViewPage 构造函数承受urltitle 。它在createState 办法中把它传递给WebViewPageState

WebViewPageState 烘托WebView ,它将initialUrl 传递给WebView ,并将this.url 作为其值。

JavaScript形式javascriptMode 被设置为JavascriptMode.unrestricted 。这种JavaScript形式使网页能够运转JavaScript。

运转应用程序

现在,咱们现已完结了编码作业。咱们将运转该应用程序。要做到这一点,在终端运转以下指令。

flutter run

假如你运用的是VS Code,右键点击lib/main.dart ,然后点击Run Without DebuggingStart Debugging

留意,请保证你的模拟器正在运转。

这将在你的手机模拟器上编译应用程序并运转它。

主页

如何使用Flutter WebView插件渲染网页(详细介绍)

点击进入Open pub.dev

如何使用Flutter WebView插件渲染网页(详细介绍)

如何使用Flutter WebView插件渲染网页(详细介绍)

如何使用Flutter WebView插件渲染网页(详细介绍)

点击Open Medium.com

如何使用Flutter WebView插件渲染网页(详细介绍)

如何使用Flutter WebView插件渲染网页(详细介绍)
如何使用Flutter WebView插件渲染网页(详细介绍)

总结

在本教程中咱们学到了很多东西。

首要,咱们开端介绍WebView ,以及怎么将其移植到Flutter。接下来,咱们介绍了webview_flutter ,还学习了怎么设置Flutter项目和装置webview_flutter 的依靠性。后来,咱们树立了小部件来烘托和显现网页 [https://blog.logrocket.com](https://blog.logrocket.com)[https://logrocket.com](https://logrocket.com)在一个来自webview_flutter 插件的WebView widget上。

有了这个webview_flutter 插件,咱们将能够在咱们的Flutter应用程序中烘托和显现网页。

请看GitHub中的源代码。

参考资料

  • webview_flutter: v2.0.10
  • 网页视图类

The postRender webpages using the Flutter WebView pluginappeared first onLogRocket Blog.