如何从 Flutter 中的资产读取 .txt 文件?

zac*_*ack 7 android dart flutter

.txt在 Flutter 项目的文件夹资产中有一个文件,当应用程序在设备上打开时,SQFlite会创建一个数据库,并且应该从该文件行读取以将它们插入到数据库中。我需要阅读.txt文件的每一行并将它们添加到List<String>这样的:

List<String> _list = await new File('$dir/assets/file.txt').readAsLines();
Run Code Online (Sandbox Code Playgroud)

我尝试使用rootBundle但我无法将结果转换为 aFile并尝试像这样直接打开文件:

String dir = (await getApplicationDocumentsDirectory()).path;
Run Code Online (Sandbox Code Playgroud)

我总是找不到文件并收到错误消息。

var byte = await rootBundle.load('assets/bot.txt'); // Can't convert it to file
String dir = (await getApplicationDocumentsDirectory()).path;
List<String> _list = await new File('$dir/assets/file.txt').readAsLines(); // Error

error FileSystemException: Cannot open file, path = '/data/user/0/com.example.animationexp/app_flutter/assets/file.txt' (OS Error: No such file or directory, errno = 2) during open, closing...
Run Code Online (Sandbox Code Playgroud)

有没有办法让我打开和阅读这个文件?

Hug*_*sos 8

它不起作用,因为您只是假设您的assets目录位于ApplicationDocumentsDirectory,然后您加入了两个目录并在不存在的路径中查找文件。

相反,您应该将文件以已知路径保存到磁盘,然后File从该路径获取:

Future<List<String>> getFileLines() async {
  final data = await rootBundle.load('assets/bot.txt');
  final directory = (await getTemporaryDirectory()).path;
  final file = await writeToFile(data, '$directory/bot.txt');
  return await file.readAsLines();
}

Future<File> writeToFile(ByteData data, String path) {
  return File(path).writeAsBytes(data.buffer.asUint8List(
    data.offsetInBytes,
    data.lengthInBytes,
  ));
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您的文件只是一个简单的文本文件,您应该尝试使用Julien Lachal 的方法。请记住,rootBundle.loadString()这不适用于大多数文件格式。


Jul*_*hal 6

声明文件后,pubspec.yml您可以使用以下命令简单地获取内容:

String fileText = await rootBundle.loadString('assets/file.txt');
print(fileText);
Run Code Online (Sandbox Code Playgroud)