Flutter - 从资产中读取文本文件
Flutter - Read text file from assets
我有一个文本文件 (.txt),我希望它成为我以后可以扫描的资产。
在 pubspec.yaml 中,我确定:
flutter:
assets:
- res/my_file.txt
存在。该文件位于我创建的 res/
文件夹中,与 lib/android/
和 ios/
处于同一级别
我正在尝试从自定义 class 而不是小部件读取文件。
根据文档,我将使用此导入:
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);
但是,当我使用像 'assets/res/my_file.txt'
这样的 fileName
时,我得到一个错误:Unable to load asset: assets/res/my_file.txt
.
还值得注意的是,我正在尝试通过单元测试来执行此操作。关于如何正确执行此操作的任何想法?谢谢!
文件夹名称 "assets" 并不是神奇地添加的。更新您的 pubspec.yaml
以包含资产的完整路径。
flutter:
assets:
- assets/res/my_file.txt
这里有一个更完整的答案供未来的访问者使用。
创建资产文件夹
在项目的根文件夹中创建一个资产文件夹。在 Android Studio 中,您可以右键单击项目大纲并转到 新建 > 目录。
如果您愿意,可以在 assets
中为文本文件创建另一个子文件夹。但如果这样做,则必须在 pubspec.yaml 中包含相对路径。见下文。
将您的文本文件添加到新文件夹
您可以将文本文件复制到 assets
目录中。例如,my_file.txt
的相对路径为 assets/my_file.txt
.
在pubspec.yaml
中注册资产文件夹
打开项目根目录中的 pubspec.yaml 文件。
像这样向 flutter 部分添加一个资产子部分:
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文件加载到flutter中,您应该将其视为文本文件并正确加载。因此,您需要将文件添加到 assets 文件夹,添加到 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();
}
}
我有一个文本文件 (.txt),我希望它成为我以后可以扫描的资产。
在 pubspec.yaml 中,我确定:
flutter:
assets:
- res/my_file.txt
存在。该文件位于我创建的 res/
文件夹中,与 lib/android/
和 ios/
我正在尝试从自定义 class 而不是小部件读取文件。
根据文档,我将使用此导入:
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);
但是,当我使用像 'assets/res/my_file.txt'
这样的 fileName
时,我得到一个错误:Unable to load asset: assets/res/my_file.txt
.
还值得注意的是,我正在尝试通过单元测试来执行此操作。关于如何正确执行此操作的任何想法?谢谢!
文件夹名称 "assets" 并不是神奇地添加的。更新您的 pubspec.yaml
以包含资产的完整路径。
flutter:
assets:
- assets/res/my_file.txt
这里有一个更完整的答案供未来的访问者使用。
创建资产文件夹
在项目的根文件夹中创建一个资产文件夹。在 Android Studio 中,您可以右键单击项目大纲并转到 新建 > 目录。
如果您愿意,可以在 assets
中为文本文件创建另一个子文件夹。但如果这样做,则必须在 pubspec.yaml 中包含相对路径。见下文。
将您的文本文件添加到新文件夹
您可以将文本文件复制到 assets
目录中。例如,my_file.txt
的相对路径为 assets/my_file.txt
.
在pubspec.yaml
中注册资产文件夹打开项目根目录中的 pubspec.yaml 文件。
像这样向 flutter 部分添加一个资产子部分:
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文件加载到flutter中,您应该将其视为文本文件并正确加载。因此,您需要将文件添加到 assets 文件夹,添加到 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();
}
}