谷歌创立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
留意,javascriptMode
和autoMediaPlaybackPolicy
参数不能为空。
创立小组件页面
现在,咱们将在咱们的应用程序中创立两个widget页面:HomePage
和WebViewPage
。HomePage
页面将容纳两个按钮。每个按钮被点击后将翻开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
是一个有状态的部件,而WebPageState
是WebViewPage
的逻辑和内部状态。
WebViewPage
构造函数承受url
和title
。它在createState
办法中把它传递给WebViewPageState
。
当WebViewPageState
烘托WebView
,它将initialUrl
传递给WebView
,并将this.url
作为其值。
JavaScript形式javascriptMode
被设置为JavascriptMode.unrestricted
。这种JavaScript形式使网页能够运转JavaScript。
运转应用程序
现在,咱们现已完结了编码作业。咱们将运转该应用程序。要做到这一点,在终端运转以下指令。
flutter run
假如你运用的是VS Code,右键点击lib/main.dart
,然后点击Run Without Debugging
或Start Debugging
。
留意,请保证你的模拟器正在运转。
这将在你的手机模拟器上编译应用程序并运转它。
主页
点击进入Open pub.dev
点击Open Medium.com
总结
在本教程中咱们学到了很多东西。
首要,咱们开端介绍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.