【问题标题】:Loading txt file as an asset for a dart package加载 txt 文件作为 dart 包的资产
【发布时间】:2021-02-03 21:19:33
【问题描述】:

在 Flutter 中,通过在 pubspec.yaml 文件中指定 .txt 资产或其文件夹,然后使用 rootBundle 加载它很容易在运行时加载它。但是,我正在开发一个纯 dart 包,我正在努力研究如何让包加载相对于它自己的目录结构的 .txt 文件。

当我在我正在处理的单独的 dart 命令行应用程序中使用该包时,我在其中一个包源代码文件中指定的相对路径会导致抛出 txt 文件不存在的错误。我理解为什么会抛出这个错误,因为相对路径被解释为来自命令行应用程序的根目录而不是包的根目录,但我不确定如何在不指定 .txt 的绝对路径的情况下解决这个问题文件。我宁愿不指定绝对路径,因为它会降低包的可移植性。

对于纯 dart 包,有什么类似于 Flutter 的资产加载的吗?

【问题讨论】:

  • 这个“纯 Dart 包”是否打算在 Flutter 应用中使用?
  • 不是。它仅适用于 dart 命令行应用程序。
  • 我不确定这是否可能。 Dart 中曾经有一个Resource 类,它已被弃用以支持资源包。资源包已停产,因为现在大多数 Dart 代码都是 AOT 编译的,此时无法获取特定源文件的位置。相反,您可能应该做的是将您的包资产写入 Dart 文件,如果最终用户需要调整任何内容,请在第一次运行实用程序时在程序的根目录中生成这些文件,然后在后续加载运行。
  • 啊,好吧,这就是我所担心的。将包资产写入 Dart 文件,是指将它们放入列表和映射文字等吗?
  • 基本上,是的。任何你需要在运行时从你的包中加载的不是代码的东西都应该被包装在一个 Dart 文件中,无论是作为一个列表、映射,甚至只是一个巨大的字符串文字。

标签: dart


【解决方案1】:

我认为您需要resolveSymbolicLinksresolveSymbolicLinksSync 方法来解码相对路径,然后使用解析的路径来读取txt文件:

import 'dart:io';

void main() async {
  String file = '../lib/main.dart';
  var path = Uri.parse('.').resolveUri(Uri.file(file)).toFilePath();
  print(path);
  if (path == '') path = '.';
  var resolved = await File(path).resolveSymbolicLinks();
  print(resolved);

  File(resolved).readAsString().then((String contents) {
    print(contents);
  });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2011-06-14
    相关资源
    最近更新 更多