Dart:相对导入更改文件夹结构

时间:2019-05-01 09:05:05

标签: import dart dart-packages

我有一个看起来像树的flutter项目

...
├── lib
│   ├── UI
│   │   ├── base_widget.dart
│   │   ├── components
│   │   │   ├── card.dart
│   │   │   ├── centered_progressIndicator.dart
│   │   │   ├── gradient_button.dart
│   │   │   └── rounded_network_image.dart
│   │   ├── more
│   │   │   ├── announcements
│   │   │   │   └── announcements.dart
│   │   │   ├── more.dart
│   ├── main.dart
├── pubspec.lock
├── pubspec.yaml
└── test
    └── widget_test.dart

announcements.dart(同样在其他一些文件中)中,我想导入card.dart。现在,我像import '../../components/card.dart';一样导入。

如果我将components目录的名称更改为其他名称,则必须编辑导入components/card.dart的所有文件。

此外,我知道不建议使用../的相对导入,应使用package:

我的问题是如何编写不影响目录结构更改的导入语句? 飞镖有可能吗?

3 个答案:

答案 0 :(得分:1)

您绝对应该能够在您自己的程序包中使用相对导入(绝不能进入或退出程序包)。

也就是说,我完全不同意:

  

此外,我知道不建议使用../进行相对导入,应使用package:。

如果重命名包含许多文件的目录,则对这些文件的所有引用都需要重写。没有办法解决。 如果在文件之间使用相对路径,则相互引用的重命名目录 inside 中的文件将不需要更改,因为它们的导入路径将不包含更改后的名称。如果您在各处使用package: URI,则还需要更改这些URI。

任何package:引用包中外部的目标都是重命名目录中的文件,因此也需要更改,因此,如果重命名目录不在lib/src/下,因此,重命名是一项重大突破,因此不适合直接外部访问。 因此,建议您将大多数源文件放入lib/src/中,然后从正确放置在lib/中的固定库中重新导出它们。只要您在公共库中导出相同的声明,就可以对lib/src/下的文件进行重组,这是不间断的更改。

这样的重命名是一个很大的重构,如果它支持IDE,让IDE帮助您重命名所有引用是个好主意。

答案 1 :(得分:0)

package:导入比相对导入更健壮,但是您需要编辑器或IDE的帮助来重命名库文件/目录。在VS Code中,您可以使用ctrl+shift+h打开项目范围内的字符串替换。这是编辑器的常见功能,并且可能是重命名库文件后更改导入语句的最佳方法。

如果您使用的是VS Code,则还有dart-import,这是用于将所有导入更改为相对于软件包的语法的扩展,并且还可以删除未使用的导入。

答案 2 :(得分:0)

使用可以使用包导入。在项目内的“ .packages”文件中添加“ projectname / lib”。然后您可以执行以下操作 “导入包:项目名称/组件/卡”

.packages中添加的路径将提供项目的lib文件夹的相对路径。