【发布时间】:2021-03-25 12:44:12
【问题描述】:
我有一个 Flutter 项目,我正在使用 webview_flutter 包创建一个 Webview 小部件。
这是我的 main.dart 文件:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:webview_flutter/webview_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Communication Bridge',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Native - JS Communication Bridge'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
WebViewController _controller;
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
appBar: AppBar(title: Text('Webview')),
body: WebView(
initialUrl: 'about:blank',
javascriptMode: JavascriptMode.unrestricted,
javascriptChannels: Set.from([
JavascriptChannel(
name: 'messageHandler',
onMessageReceived: (JavascriptMessage message) {
_scaffoldKey.currentState.showSnackBar(
SnackBar(
content: Text(
message.message)
)
);
})
]),
onWebViewCreated: (WebViewController webviewController) {
_controller = webviewController;
_loadHtmlFromAssets();
},
),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.arrow_upward),
onPressed: () {
_controller.evaluateJavascript('foo("message")');
},
),
);
}
_loadHtmlFromAssets() async {
String file = await rootBundle.loadString('assets/index.html');
_controller.loadUrl(Uri.dataFromString(
file,
mimeType: 'text/html',
encoding: Encoding.getByName('utf-8')).toString());
}
}
如您所见,我正在将一个本地 html 文件加载到 webview (_loadHtmlFromAssets) 中。
html 文件有以下标记:
<html>
<head>
<title>My Local HTML File</title>
</head>
<body>
<script type="text/javascript">
function foo(msg) {
//Code
}
</script>
</body>
</html>
当 html 包含像上面代码这样的 javascript 时,我没有问题并且能够从应用程序与 webview 进行通信。
我想将 javascript 代码放在一个单独的文件中,而不是放在 html 文件中。
<html>
<head>
<title>My Local HTML File</title>
</head>
<body>
<script src="script.js"></script> // <-------
</body>
</html>
当我尝试这样做时,我收到以下错误(它试图引用 javascript 文件中定义的方法):
I/chromium(15188): [INFO:CONSOLE(1)] "Uncaught ReferenceError: foo is not defined
我已在资产下的 pubspec.yaml 中添加了该文件,所以这不是问题。
我在 SO 上看到过这个 question,但那里的解决方案没有帮助。
【问题讨论】: