Ответ 1
Имя папки "активы" не добавлено магически. Обновите свой pubspec.yaml
чтобы включить полный путь к активу.
flutter:
assets:
- assets/res/my_file.txt
У меня есть текстовый файл (.txt), который я бы хотел использовать для дальнейшего сканирования.
В pubspec.yaml я убедился, что:
flutter:
assets:
- res/my_file.txt
существует. Файл находится в папке res/
которую я создал, на том же уровне, что и lib/android/
и ios/
Я пытаюсь прочитать файл из пользовательского класса, а не виджета.
Согласно документации, я должен использовать этот импорт:
import 'package:flutter/services.dart' show rootBundle;
и начните читать так:
/// Assumes the given path is a text-file-asset.
Future<String> getFileData(String path) async {
return await rootBundle.loadString(path);
}
И чтобы получить фактические данные, выполните следующие действия:
String data = await getFileData(fileName);
Однако, когда я использую fileName
типа 'assets/res/my_file.txt'
, я получаю сообщение об ошибке: Unable to load asset: assets/res/my_file.txt
.
Также стоит отметить, что я пытаюсь сделать это из модульного теста. Любые идеи о том, как правильно это сделать? Благодарю!
Имя папки "активы" не добавлено магически. Обновите свой pubspec.yaml
чтобы включить полный путь к активу.
flutter:
assets:
- assets/res/my_file.txt
Вот более полный ответ для будущих посетителей.
Создайте папку ресурсов в корневой папке вашего проекта. В Android Studio вы можете щелкнуть правой кнопкой мыши схему проекта и перейти в " Создать"> "Каталог".
Вы можете создать другую подпапку для текстовых файлов в assets
если хотите. Но если вы это сделаете, вы должны включить относительный путь в pubspec.yaml. Увидеть ниже.
Вы можете просто скопировать ваш текстовый файл в каталог assets
. Например, относительный путь my_file.txt
будет assets/my_file.txt
.
Откройте файл pubspec.yaml, который находится в корне вашего проекта.
Добавьте подраздел активов в секцию флаттера следующим образом:
flutter:
assets:
- assets/my_file.txt
Если у вас есть несколько файлов, которые вы хотите включить, то вы можете не указывать имя файла и просто использовать имя каталога (включая финальный /):
flutter:
assets:
- assets/
Вы можете использовать глобальный rootBundle
чтобы получить актив текстового файла:
import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;
Future<String> loadAsset() async {
return await rootBundle.loadString('assets/my_text.txt');
}
Или, если у вас есть BuildContext (внутри виджета), вы можете использовать DefaultAssetBundle. Это рекомендуется, поскольку позволяет переключать пакеты ресурсов во время выполнения, что полезно для многоязычных активов.
Future<String> loadAsset(BuildContext context) async {
return await DefaultAssetBundle.of(context).loadString('assets/my_text.txt');
}
На мой взгляд, чтобы загрузить файл js во флаттер, вы должны рассматривать его как текстовый файл и загружать его правильно. Итак, вам нужно добавить файл в папку активов, добавить в файл pubspec, а затем загрузить его. прочитайте полный ответ здесь
Во-вторых, вы использовали evalJavascript. эта функция может использоваться во многих различных ситуациях. но это будет работать, только если у вас есть панель просмотра.
Проверьте ниже пример:
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
main() async {
String jsCode = await rootBundle.loadString('assets/javascript.js');
runApp(new MaterialApp(
home: LunchWebView(jsCode),
));
}
class LunchWebView extends StatelessWidget {
final String text;
LunchWebView(this.text);
@override
Widget build(BuildContext context) {
final FlutterWebviewPlugin flutterWebviewPlugin = FlutterWebviewPlugin();
flutterWebviewPlugin.launch('https://www.google.com');
flutterWebviewPlugin.evalJavascript(text);
return Container();
}
}