Flutter WebView插件webview_flutter_wkwebview_pagecall_poc的使用
Flutter WebView插件webview_flutter_wkwebview_pagecall_poc的使用
简介
webview_flutter_wkwebview
是 webview_flutter
插件的 Apple WKWebView 实现。它允许开发者在 Flutter 应用中嵌入高性能的网页视图。
使用方法
要使用 webview_flutter_wkwebview
,只需按照以下步骤操作即可:
-
在
pubspec.yaml
文件中添加依赖:dependencies: webview_flutter_wkwebview: ^latest_version
替换
latest_version
为最新版本号。 -
运行
flutter pub get
来安装依赖。 -
在代码中直接使用
webview_flutter
,该插件会自动包含webview_flutter_wkwebview
的实现。
完整示例代码
以下是使用 webview_flutter_wkwebview
的完整示例代码:
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// ignore_for_file: public_member_api_docs
import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart';
void main() {
runApp(const MaterialApp(home: WebViewExample()));
}
class WebViewExample extends StatefulWidget {
const WebViewExample({Key? key}) : super(key: key);
@override
State<StatefulWidget> createState() => _WebViewExampleState();
}
class _WebViewExampleState extends State<WebViewExample> {
late final PlatformWebViewController _controller;
@override
void initState() {
super.initState();
_controller = PlatformWebViewController(
WebKitWebViewControllerCreationParams(allowsInlineMediaPlayback: true),
)
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setBackgroundColor(const Color(0x80000000))
..setPlatformNavigationDelegate(
PlatformNavigationDelegate(
const PlatformNavigationDelegateCreationParams(),
)
..setOnProgress((int progress) {
debugPrint('WebView is loading (progress : $progress%)');
})
..setOnPageStarted((String url) {
debugPrint('Page started loading: $url');
})
..setOnPageFinished((String url) {
debugPrint('Page finished loading: $url');
})
..setOnWebResourceError((WebResourceError error) {
debugPrint('''
Page resource error:
code: ${error.errorCode}
description: ${error.description}
errorType: ${error.errorType}
isForMainFrame: ${error.isForMainFrame}
''');
})
..setOnNavigationRequest((NavigationRequest request) {
if (request.url.startsWith('https://www.youtube.com/')) {
debugPrint('blocking navigation to ${request.url}');
return NavigationDecision.prevent;
}
debugPrint('allowing navigation to ${request.url}');
return NavigationDecision.navigate;
}),
)
..addJavaScriptChannel(JavaScriptChannelParams(
name: 'Toaster',
onMessageReceived: (JavaScriptMessage message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(message.message)),
);
},
))
..loadRequest(LoadRequestParams(
uri: Uri.parse('https://flutter.dev'),
));
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Flutter WebView Example'),
),
body: PlatformWebViewWidget(
PlatformWebViewWidgetCreationParams(controller: _controller),
).build(context),
floatingActionButton: FloatingActionButton(
onPressed: () async {
final String? url = await _controller.currentUrl();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Current URL: $url')),
);
},
child: const Icon(Icons.link),
),
);
}
}
代码说明
-
初始化 WebView
- 使用
PlatformWebViewController
创建一个 WebView 控制器。 - 配置导航委托 (
PlatformNavigationDelegate
) 来拦截导航请求并处理加载进度、页面开始加载、结束加载等事件。
- 使用
-
JavaScript 通信
- 添加了一个名为
Toaster
的 JavaScript 通道,用于与 WebView 中的 JavaScript 交互。
- 添加了一个名为
-
加载网页
- 使用
loadRequest
方法加载指定的 URL(如https://flutter.dev
)。
- 使用
-
浮动按钮
- 提供一个浮动按钮,用于获取当前加载的 URL 并显示在 SnackBar 中。
运行效果
运行此代码后,您将看到一个带有导航栏的 WebView,能够加载指定的网页,并且可以通过浮动按钮查看当前加载的 URL。
贡献指南
如果您想为该插件贡献代码或修复问题,请参考以下步骤:
- 编辑
pigeons/web_kit.dart
文件以更新通信接口。 - 运行以下命令生成通信层:
flutter pub run pigeon --input pigeons/web_kit.dart
- 使用
build_runner
生成测试所需的模拟对象:flutter pub run build_runner build --delete-conflicting-outputs
更多关于Flutter WebView插件webview_flutter_wkwebview_pagecall_poc的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter WebView插件webview_flutter_wkwebview_pagecall_poc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
webview_flutter_wkwebview_pagecall_poc
是一个基于 webview_flutter
插件的扩展,专门用于在 iOS 上使用 WKWebView 并实现页面调用(Page Call)功能的插件。这个插件允许你在 Flutter 应用中嵌入 WebView,并通过 JavaScript 与原生代码进行交互。
安装步骤
-
添加依赖:在
pubspec.yaml
文件中添加webview_flutter_wkwebview_pagecall_poc
依赖。dependencies: flutter: sdk: flutter webview_flutter_wkwebview_pagecall_poc: ^0.0.1 # 请根据实际情况使用最新版本
-
安装依赖:运行
flutter pub get
来安装依赖。
基本用法
-
导入库:在 Dart 文件中导入
webview_flutter_wkwebview_pagecall_poc
。import 'package:webview_flutter_wkwebview_pagecall_poc/webview_flutter_wkwebview_pagecall_poc.dart';
-
创建 WebView:使用
WebView
组件来创建并显示 WebView。你可以通过JavaScriptMode.unrestricted
来启用 JavaScript。class MyWebView extends StatefulWidget { [@override](/user/override) _MyWebViewState createState() => _MyWebViewState(); } class _MyWebViewState extends State<MyWebView> { WebViewController _controller; [@override](/user/override) Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('WebView Example'), ), body: WebView( initialUrl: 'https://example.com', javascriptMode: JavascriptMode.unrestricted, onWebViewCreated: (WebViewController webViewController) { _controller = webViewController; }, javascriptChannels: <JavascriptChannel>{ _toasterJavascriptChannel(context), }, ), ); } JavascriptChannel _toasterJavascriptChannel(BuildContext context) { return JavascriptChannel( name: 'Toaster', onMessageReceived: (JavascriptMessage message) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(message.message)), ); }); } }
-
JavaScript 与原生代码交互:你可以在 WebView 中通过 JavaScript 调用原生代码。例如,在 WebView 中执行以下 JavaScript 代码:
Toaster.postMessage('Hello from JavaScript!');
这将会触发
JavascriptChannel
的onMessageReceived
回调,并在 Flutter 中显示一个 SnackBar。
高级用法
-
页面调用 (Page Call):
webview_flutter_wkwebview_pagecall_poc
插件允许你在 WebView 中调用原生代码。你可以通过JavascriptChannel
来实现这一点。 -
自定义 JavaScript 接口:你可以定义多个
JavascriptChannel
来处理不同的 JavaScript 调用。
注意事项
-
iOS 平台:由于这个插件是基于 WKWebView 的,因此它主要针对 iOS 平台。在 Android 上,它仍然会使用默认的
webview_flutter
实现。 -
权限:确保在
Info.plist
文件中添加必要的权限,例如允许加载 HTTP 内容:<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
示例代码
以下是一个完整的示例代码,展示了如何使用 webview_flutter_wkwebview_pagecall_poc
插件:
import 'package:flutter/material.dart';
import 'package:webview_flutter_wkwebview_pagecall_poc/webview_flutter_wkwebview_pagecall_poc.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'WebView Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyWebView(),
);
}
}
class MyWebView extends StatefulWidget {
[@override](/user/override)
_MyWebViewState createState() => _MyWebViewState();
}
class _MyWebViewState extends State<MyWebView> {
WebViewController _controller;
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('WebView Example'),
),
body: WebView(
initialUrl: 'https://example.com',
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
_controller = webViewController;
},
javascriptChannels: <JavascriptChannel>{
_toasterJavascriptChannel(context),
},
),
);
}
JavascriptChannel _toasterJavascriptChannel(BuildContext context) {
return JavascriptChannel(
name: 'Toaster',
onMessageReceived: (JavascriptMessage message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(message.message)),
);
});
}
}