Flutter -从资源读取文本文件

uxhixvfz  于 2023-04-13  发布在  Flutter
关注(0)|答案(4)|浏览(213)

我有一个文本文件(.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
同样值得注意的是,我正试图从单元测试中做到这一点。对于如何正确地做到这一点,有什么想法吗?谢谢!

4sup72z8

4sup72z81#

这里有一个更完整的答案为未来的游客。

创建资产文件夹

在项目的根文件夹中创建一个assets文件夹,在Android Studio中右键单击项目大纲,进入【新建】〉【目录】。

如果你愿意,你可以在assets中为文本文件创建另一个子文件夹。但是如果你这样做,你必须在pubspec. yaml中包含相对路径。见下文。

将文本文件添加到新文件夹

您可以将文本文件复制到assets目录中。例如,my_file.txt的相对路径为assets/my_file.txt

注册pubspec.yaml中的assets文件夹

打开项目根目录中的pubspec.yaml文件。
在flutter部分添加一个assets子部分,如下所示:

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');
}

参见

wko9yo5t

wko9yo5t2#

文件夹名“assets”没有自动添加。请更新您的pubspec.yaml以包含资产的完整路径。

flutter:
  assets:
    - assets/res/my_file.txt
qco9c6ql

qco9c6ql3#

在我看来,为了将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();
  }
}
6xfqseft

6xfqseft4#

如前所述,下面的代码'文件夹名称'可以给'资产',如果引用资产文件夹或任何其他目录(ex-custom_widget等)在项目中

void loadAsset() async {
    await rootBundle.loadString('folder_name/custom_button.dart').then((value) =>
        print(value));
  }

相关问题