单击 WebView 中的按钮时,请检查以下步骤以获取触发器:
添加 webview 插件
webview_flutter: ^0.3.22+1
在pubspec.yaml
assets:
assets/about_us.html
在 assets 文件夹中添加了 html 文件
about_us.html
<html>
<head>
<script type="text/javascript">
function invokeNative() {
MessageInvoker.postMessage('Trigger from Javascript code');
}
</script> </head>
<body>
<form>
<input type="button" value="Click me!" onclick="invokeNative()" />
</form> </body>
</html>
根据以下语句,您可以看到我正在加载一个 WebView,当我单击名为Click me!的按钮时 在 WebView 中,flutter 中的 JavascriptChannel 将被调用,并显示一条消息“来自 Javascript 代码的触发器”
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:webview_flutter/webview_flutter.dart';
class WebViewApp extends StatefulWidget {
WebViewApp({Key key, this.title}) : super(key: key);
final String title;
@override
_WebViewAppState createState() => _WebViewAppState();
}
class _WebViewAppState extends State<WebViewApp> {
WebViewController _controller;
Future<void> loadHtmlFromAssets(String filename, controller) async {
String fileText = await rootBundle.loadString(filename);
controller.loadUrl(Uri.dataFromString(fileText,
mimeType: 'text/html', encoding: Encoding.getByName('utf-8'))
.toString());
}
Future<String> loadLocal() async {
return await rootBundle.loadString('assets/about_us.html');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: FutureBuilder<String>(
future: loadLocal(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return WebView(
initialUrl:
new Uri.dataFromString(snapshot.data, mimeType: 'text/html')
.toString(),
javascriptMode: JavascriptMode.unrestricted,
javascriptChannels: <JavascriptChannel>[
JavascriptChannel(
name: 'MessageInvoker',
onMessageReceived: (s) {
Scaffold.of(context).showSnackBar(SnackBar(
content: Text(s.message),
));
}),
].toSet(),
);
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
return CircularProgressIndicator();
},
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
正如您在代码中看到的,JavascriptChannel
当用户单击 webview 中的按钮时,将调用一个。有一个密钥可以识别频道,在我的情况下是MessageInvoker
.
希望这能解决问题...
