Используйте файл js внутри флаттера файла html - PullRequest
0 голосов
/ 27 января 2020

Как использовать файл js, связанный с html в Flutter. Я использую плагин 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());

  }

И это my html file

<!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">

Это сообщение появляется в conosle

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

1 Ответ

0 голосов
/ 27 января 2020

Вместо того, чтобы читать ресурс и затем загружать из данных URI, просто передайте путь к активу, например, так:

  _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 добавить usesCleartextTraffic="true" в файл манифеста:

    <application
        ....
        android:usesCleartextTraffic="true"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...