flutter如何实现js交互
在Flutter中如何实现与JavaScript的交互?具体有哪些方法可以实现双向通信?比如通过WebView调用JS函数,或者使用JS Bridge等方案。求一个详细的实现示例,包括Dart端和JS端的代码写法,以及需要注意的兼容性和性能问题。
2 回复
Flutter通过webview_flutter插件实现JS交互。使用WebViewController的runJavaScript方法执行JS代码,addJavaScriptChannel接收JS回调。适用于WebView内嵌网页的交互场景。
更多关于flutter如何实现js交互的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中实现与JavaScript的交互主要通过webview_flutter插件完成。以下是具体实现方法:
1. 添加依赖
dependencies:
webview_flutter: ^4.4.2
2. 基本实现代码
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
class JsInteractionPage extends StatefulWidget {
@override
_JsInteractionPageState createState() => _JsInteractionPageState();
}
class _JsInteractionPageState extends State<JsInteractionPage> {
late WebViewController controller;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('JS交互示例')),
body: WebView(
initialUrl: 'about:blank',
onWebViewCreated: (WebViewController webViewController) {
controller = webViewController;
_loadHtml();
},
javascriptMode: JavascriptMode.unrestricted,
onPageFinished: (String url) {
// 页面加载完成后执行JS
_injectJavaScript();
},
),
floatingActionButton: FloatingActionButton(
onPressed: _callJavaScript,
child: Icon(Icons.code),
),
);
}
void _loadHtml() {
final htmlContent = '''
<html>
<body>
<h1>Flutter与JS交互</h1>
<button onclick="showMessage('来自JS的消息')">点击调用Flutter</button>
<p id="result"></p>
</body>
<script>
function showMessage(message) {
// 调用Flutter方法
if (window.flutter_inappwebview) {
window.flutter_inappwebview.callHandler('jsToFlutter', message);
}
}
// 接收来自Flutter的调用
window.updateFromFlutter = function(data) {
document.getElementById('result').innerHTML = 'Flutter说: ' + data;
};
</script>
</html>
''';
controller.loadUrl(Uri.dataFromString(htmlContent, mimeType: 'text/html').toString());
}
void _injectJavaScript() async {
// 注册JS调用Flutter的处理器
await controller.addJavaScriptHandler(
handlerName: 'jsToFlutter',
callback: (List<dynamic> arguments) {
// 接收来自JS的消息
print('收到JS消息: ${arguments[0]}');
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('JS说: ${arguments[0]}'))
);
},
);
}
void _callJavaScript() async {
// Flutter调用JS函数
await controller.runJavaScript('updateFromFlutter("Hello from Flutter!")');
}
}
3. 主要交互方式
JS调用Flutter
// 注册处理器
await controller.addJavaScriptHandler(
handlerName: 'methodName',
callback: (arguments) {
// 处理逻辑
},
);
// JS中调用
window.flutter_inappwebview.callHandler('methodName', data);
Flutter调用JS
// 执行JS代码
await controller.runJavaScript('jsFunction("参数")');
// 执行JS并获取返回值
var result = await controller.runJavaScriptReturningResult('1+1');
4. 注意事项
- 确保WebView的
javascriptMode设置为JavascriptMode.unrestricted - 在合适的生命周期注册JS处理器(如
onPageFinished) - 处理异步调用和错误情况
- 注意数据类型转换(JSON自动转换)
这种方案适用于需要在Flutter中嵌入Web内容并实现双向通信的场景。

