Flutter WebView桥接插件ds_bridge_webview的使用
Flutter WebView桥接插件ds_bridge_webview的使用
说明
此包是webview_flutter
插件的扩展,用于实现WebView与网页之间的交互。
配置依赖包
在项目的pubspec.yaml
文件中添加以下依赖:
dependencies:
ds_bridge_webview: ^0.0.1
示例
在webview页面添加JavaScript通道
首先创建一个名为webview.dart
的文件,并添加以下代码:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import '../../routes/application.dart';
import '../../utils/JsBridgeUtil.dart';
class WebviewPage extends StatefulWidget {
final String url;
final VoidCallback backCallback;
WebviewPage({
Key key,
@required this.url,
this.backCallback,
}) : super(key: key);
@override
_WebviewPageState createState() => _WebviewPageState();
}
class _WebviewPageState extends State<WebviewPage> {
String _title = 'ds_bridge';
WebViewController _webViewController;
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
hoverColor: Colors.transparent,
highlightColor: Colors.transparent,
icon: Icon(const IconData(0xe61b, fontFamily: 'IconFont'), color: Color(0xff333333), size: 18),
onPressed: () => Application.router.pop(context),
),
title: new Text(
'$_title',
style: TextStyle(color: Color(0xff333333), fontSize: 17),
),
backgroundColor: Color(0xffffffff),
shadowColor: Colors.transparent,
centerTitle: true,
actions: [
FutureBuilder<WebViewController>(
builder: (BuildContext context, AsyncSnapshot<WebViewController> controller) {
return IconButton(
onPressed: () {
reloadWebView();
},
icon: new Icon(
Icons.refresh_outlined,
color: Color(0xff333333),
size: 20
)
);
}
),
],
),
body: WebView(
onWebViewCreated: (controller) {
_webViewController = controller;
},
initialUrl: widget.url,
javascriptMode: JavascriptMode.unrestricted,
javascriptChannels: <JavascriptChannel>{
_javascriptChannel(context),
_javascriptChannel2(context),
},
onPageStarted: (String url) {
if (url.startsWith("mailto") || url.startsWith("tel") || url.startsWith("http") || url.startsWith("https")) {
} else {
_webViewController.goBack();
}
},
onPageFinished: (controller) {
// 获取页面标题
setState(() {
_title = _webViewController.getTitle() as String;
});
},
)
);
}
// js桥通道
JavascriptChannel _javascriptChannel(BuildContext context) {
return JavascriptChannel(
name: 'DsBridgeApp',
onMessageReceived: (JavascriptMessage message) {
String jsonStr = message.message;
JsBridgeUtil.executeMethod(_webViewController, jsonStr);
});
}
// js alert通道
JavascriptChannel _javascriptChannel2(BuildContext context) {
return JavascriptChannel(
name: 'Alert',
onMessageReceived: (JavascriptMessage message) {
String jsonStr = message.message;
_showMyDialog(context, jsonStr);
});
}
void reloadWebView() {
_webViewController?.reload();
}
}
在JsBridgeUtil类中
创建一个名为JsBridgeUtil.dart
的文件,并添加以下代码:
import 'package:ds_bridge_webview/ds_bridge_webview.dart';
class JsBridgeUtil {
// 向H5调用接口
static executeMethod(flutterWebViewPlugin, String jsonStr) async{
DsBridge dsBridge = DsBridge(flutterWebViewPlugin);
Result result = dsBridge.dispatch(jsonStr);
if(result.method == 'share'){
result.callBack('收到网页端share事件,内容为${result.data}并返回此文本给网页');
}
if(result.method == 'share1'){
result.callBack('收到网页端share1事件');
}
}
}
更多关于Flutter WebView桥接插件ds_bridge_webview的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter WebView桥接插件ds_bridge_webview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
ds_bridge_webview
是一个用于在 Flutter 中实现 WebView 与原生代码桥接的插件。它允许你在 WebView 中运行的 JavaScript 代码与 Flutter 原生代码进行双向通信。以下是如何使用 ds_bridge_webview
的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 ds_bridge_webview
插件的依赖。
dependencies:
flutter:
sdk: flutter
ds_bridge_webview: ^版本号
然后运行 flutter pub get
来获取依赖。
2. 导入包
在你的 Dart 文件中导入 ds_bridge_webview
包。
import 'package:ds_bridge_webview/ds_bridge_webview.dart';
3. 创建 WebView
使用 DSBridgeWebView
组件来创建一个 WebView,并指定要加载的 URL 或 HTML 内容。
class MyWebView extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('WebView Example'),
),
body: DSBridgeWebView(
initialUrl: 'https://example.com',
onWebViewCreated: (controller) {
// WebView 创建完成后的回调
},
),
);
}
}
4. 注册 JavaScript 方法
你可以在 Flutter 中注册 JavaScript 方法,供 WebView 中的 JavaScript 调用。
DSBridgeWebViewController? _webViewController;
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('WebView Example'),
),
body: DSBridgeWebView(
initialUrl: 'https://example.com',
onWebViewCreated: (controller) {
_webViewController = controller;
// 注册名为 'nativeMethod' 的方法
_webViewController?.registerHandler('nativeMethod', (data) {
print('Received data from JavaScript: $data');
return 'Response from Flutter';
});
},
),
);
}
5. 在 JavaScript 中调用 Flutter 方法
在 WebView 中运行的 JavaScript 可以通过 dsBridge.call('nativeMethod', data)
来调用 Flutter 中注册的方法。
dsBridge.call('nativeMethod', { key: 'value' }, function(response) {
console.log('Response from Flutter:', response);
});
6. 在 Flutter 中调用 JavaScript 方法
你也可以在 Flutter 中调用 WebView 中的 JavaScript 方法。
_webViewController?.callHandler('jsMethod', {'key': 'value'}).then((response) {
print('Response from JavaScript: $response');
});
7. 处理 WebView 的生命周期
你可以通过 DSBridgeWebViewController
来处理 WebView 的生命周期事件,例如页面加载完成、页面开始加载等。
_webViewController?.onPageFinished = (url) {
print('Page finished loading: $url');
};
8. 处理 JavaScript 返回值
当你在 Flutter 中调用 JavaScript 方法时,可以通过 then
方法来处理返回的值。
_webViewController?.callHandler('jsMethod', {'key': 'value'}).then((response) {
print('Response from JavaScript: $response');
});
9. 销毁 WebView
当不再需要 WebView 时,确保销毁它以释放资源。
[@override](/user/override)
void dispose() {
_webViewController?.dispose();
super.dispose();
}