【问题标题】:Flutter imports : relative path or package?Flutter 导入:相对路径还是包?
【发布时间】:2020-04-28 18:48:22
【问题描述】:

在 Flutter 中,为了在我们自己的包的 lib 目录中导入库,我们应该使用相对导入

import 'foo.dart'

还是包导入?

import 'package:my_app/lib/src/foo.dart'

Dart guidelines 提倡使用相对导入:

在您自己的包的 lib 目录中导入库时首选相对路径。

Provider 包对always use packages imports 说:

  • 始终使用包导入。例如:import 'package:my_app/my_code.dart';

除了简洁之外还有什么不同吗?为什么包导入会比相对导入减少错误?

【问题讨论】:

    标签: flutter dart flutter-provider


    【解决方案1】:

    提供者不再需要包导入。

    这是一个旧的 Dart 错误的解决方法:Flutter: Retrieving top-level state from child returns null

    TL;DR,通过混合相对导入和绝对导入,Dart 有时会创建类定义的副本。

    这导致了荒谬的一句话:

    import 'package:myApp/test.dart' as absolute;
    import './test.dart' as relative;
    
    void main() {
      print(relative.Test().runtimeType == absolute.Test().runtimeType); // false
    }
    

    由于provider依赖runtimeType来解析对象,所以这个bug导致provider在某些情况下无法获取对象。

    【讨论】:

    • 你写的是过去式,这个bug现在解决了吗?
    • 但是,何时使用哪种导入方式的问题仍然悬而未决。是否有规则或最佳实践,何时以一种方式进行,何时以另一种方式进行?
    【解决方案2】:

    从同一个Dart guidelines,进一步向下,他们给出了相对导入的原因:

    没有深刻的理由偏爱前者——它只是更短,而且我们希望保持一致。

    就个人而言,我更喜欢绝对方法,尽管它更冗长,因为这意味着当我从不同的 dart 文件(在其他文件夹中)导入时,我不必确定要导入的文件在哪里,相对于当前文件。虚构的例子:

    我有两个不同文件夹级别的 dart 文件需要导入 themes/style.dart

    一个是widgets/animation/box_anim.dart,其中相对路径导入为:

    import '../../themes/style.dart';
    

    另一个是screens/home_screen.dart,带有相对导入:

    import '../themes/style.dart';
    

    这可能会让人感到困惑,所以我发现最好在两个文件中都使用绝对值,并保持一致:

    import 'package:myapp/themes/style.dart';
    

    并且始终坚持这条规则。所以,基本上,无论你使用什么方法——一致性是关键!

    Linter for Dart 包也有 something to say about this,但更多的是关于在“/lib”文件夹中混合的注意事项

    请避免对 lib/ 中的文件进行相对导入。

    当混合相对导入和绝对导入时,可以创建 同一成员以两种不同方式导入的混乱。 避免这种情况的一种简单方法是确保您没有相对进口 在路径中包含 lib/。

    【讨论】:

      【解决方案3】:

      TLDR;选择你喜欢的,注意官方推荐prefer_relative_importsEffective Dart guide

      首先,正如this answer 中提到的,Provider 不再推荐包导入。

      Dart linter 提供了一个规则列表,包括一些预定义的规则集:

      导入规则

      实际上有两个以上关于进口的相反规则:

      • avoid_relative_lib_imports,在 pedanticlints 规则集中启用,基本上建议避免在其路径中包含“lib”的导入。

      以下两个是你提到的:

      我应该选择哪一个?

      选择你想要的规则!它不会导致任何性能问题,并且没有规则可以减少错误。只需选择一个并使您的导入在您的所有项目中保持一致,这要感谢 Dart linter。

      我个人更喜欢使用 prefer_relative_imports,这是 Dart 团队推荐的,this VSCode extension 会自动修复和排序我的导入。

      【讨论】:

      • 很好的调用,尤其是VSCode扩展,节省了大量时间。
      • vscode-dart-import 扩展工作正常。谢谢。
      猜你喜欢
      • 2015-11-13
      • 2019-09-09
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 2018-09-17
      • 2014-03-09
      • 2011-10-16
      相关资源
      最近更新 更多