gpt4 book ai didi

javascript - 在 Flutter 的 html 文件中使用 js 文件

转载 作者:行者123 更新时间:2023-12-03 04:59:10 27 4
gpt4 key购买 nike

如何在 Flutter 中使用与 html 关联的 js 文件。我使用 webview_flutter 插件来加载 index.html 文件并且它可以工作,但是我无法加载 js 文件这是我的 Flutter 代码:

return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: WebView(
initialUrl: '',
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
_webViewController = webViewController;
_loadHtmlFromAssets();
},
),



_loadHtmlFromAssets() async {
String fileHtmlContents = await rootBundle.loadString('files/index.html');
_webViewController.loadUrl(Uri.dataFromString(fileHtmlContents, mimeType: 'text/html', encoding: Encoding.getByName('utf-8')).toString());

}

这是我的html文件

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" **src="files/plotter.js**"></script>
<title>Test plotter</title>
</head>
<body>
<!-- <script type="text/javascript" src="plotter.js"></script> -->
<div id='test'></div>


<script type="text/javascript">

这是出现在控制台中的消息

I/chromium(31201): [INFO:CONSOLE(86)] "Uncaught ReferenceError: Plotter is not defined", source: data:text/html;charset=utf-8,%

最佳答案

不是读取 Assets 然后从数据 uri 加载,而是像这样传递 Assets 路径:

  _loadHtmlFromAssets() async {
_webViewController.loadUrl('file:///android_asset/flutter_assets/files/index.html');
}

并且在 index.html 文件中,脚本路径应该是相对的。对我来说 index.html 和 index.js 在同一条路径上,所以这有效:

<script src="index.js"></script>

我的 pubspec.yml 看起来像这样:

  assets:
- files/index.html
- files/index.js

编辑

平台独立解决方案使用local_assets_server :

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:local_assets_server/local_assets_server.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) => MaterialApp(home: MyWidget());
}

class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
String address;
int port;
bool isListening = false;

@override
initState() {
_initServer();
super.initState();
}

_initServer() async {
final server = new LocalAssetsServer(
address: InternetAddress.loopbackIPv4,
assetsBasePath: 'files',
);
final address = await server.serve();
setState(() {
this.address = address.address;
port = server.boundPort;
isListening = true;
});
}

List<String> propList = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('My WebView'),
),
body: !isListening ? Center(child: CircularProgressIndicator()) : WebView(
initialUrl: 'http://$address:$port',
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
}),
);
}
}

对于 android,在 list 文件中添加 usesCleartextTraffic="true":

    <application
....
android:usesCleartextTraffic="true"

关于javascript - 在 Flutter 的 html 文件中使用 js 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59927728/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com