我有一个看起来像树的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:
。
我的问题是如何编写不影响目录结构更改的导入语句? 飞镖有可能吗?
答案 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文件夹的相对路径。