【问题标题】:Dart: Relative import changing folder structureDart:相对导入更改文件夹结构
【发布时间】:2019-05-01 09:05:04
【问题描述】:

我有一个颤振项目,树看起来像

...
├── 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:

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

【问题讨论】:

    标签: import dart dart-packages


    【解决方案1】:

    您绝对应该能够在自己的包中使用相对导入(并且永远不会进入或退出包)。

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

    另外,我知道不推荐使用 ../ 进行相对导入,应该使用 package:.

    如果重命名包含许多文件的目录,则需要重写对这些文件的所有引用。没有办法解决这个问题。 如果您在文件之间使用相对路径,则重命名目录中 相互引用的文件将不需要更改,因为它们的导入路径不会包含更改后的名称。如果您在任何地方都使用 package: URI,那么这些也需要更改。

    任何package: 引用包的外部,它以重命名目录中的文件为目标,也需要更改,因此如果重命名目录不在lib/src/ 下,因此不打算对于直接外部访问,重命名是一项重大更改。 这就是为什么建议您将大部分源文件放入lib/src/,然后从直接放置在lib/ 的固定库中重新导出它们。这使得重构 lib/src/ 下的文件成为一项非破坏性更改,只要您在公共库中导出相同的声明即可。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • android studio/intelliJ IDE 的任何类似扩展?
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-08-22
        • 1970-01-01
        • 1970-01-01
        • 2014-01-08
        • 2021-10-22
        • 2016-12-29
        • 1970-01-01
        • 2022-07-16
        • 2012-12-13
        相关资源
        最近更新 更多