Dart 包 - 如何隐藏内部方法和类?

Dig*_*iro 5 package dart flutter

我正在为 Flutter Apps 开发一个包

有些方法和类只对包本身有用,对导入我的包的程序员没有用,是否可以隐藏这些方法和类以供进一步实现?

例子:

数据服务.dart

export class DataService{

    //Must be visible only for my library
    static notifyDataChanged(InternalEvent internalEvent){ ... }

    //Must be visible for anyone
    static addCallbackOnDataChange(onDataChangeCallback) { ... }

}
Run Code Online (Sandbox Code Playgroud)

内部事件.dart

//Must be visible only for my library as well
export class InternalEvent {
   ...
}
Run Code Online (Sandbox Code Playgroud)

lrn*_*lrn 8

具有仅包声明的通常方法是将它们放在lib/src/目录中的库中,而不是导出该库。包中的其他库可以导入仅包的库,但不鼓励包外的用户lib/src/直接导入库。(这不是不可能的,只是不鼓励的事情,因为包可以在没有警告的情况下自由更改这些库)。

如果仅包功能需要访问公共类的库私有部分,则它们需要在同一个库中。传统的方法是在库中声明lib/src/并仅导出该库中需要公开的部分:

library myPackage;
export "src/allDeclarations" hide Private, Declarations;
// or 
export "src/allDeclarations" show Public, Things;
Run Code Online (Sandbox Code Playgroud)

通常,如果绝对必要,您应该只将导出和非导出的声明放在同一个库中。否则hide/show列表会变得太麻烦,并且很容易忘记hide列表中的声明。


Mab*_*ten 8

对于包私有成员,存在注释@internal.

使用@internal分析仪会在以下情况下发出警告:

  • 您导出带注释的元素(从 下的文件中lib
  • 您的包的使用者导入带注释的元素

不管怎样,在我看来,Dart 让事情变得非常复杂。需要有既不完全公开又不能从文件外部访问的成员,这是基本的要求,但没有任何解决方案可以提供确定性。注意:

  • 该文档说将包私有元素保留在下面的文件中lib/src但包的使用者仍然能够导入它们,甚至分析器不会产生警告;这只是对流;
  • 使用@internal注释,分析器(即依赖于分析器的IDE)会产生警告,但无论如何都不会阻止您编译代码。如果在不遵守注释时提高分析器生成的警告的严重级别,情况会稍有改善。为此,您需要创建一个 Analysis_options.dart 文件,如下所示:
    analyzer:
      errors:
        invalid_use_of_internal_member: error #possible values: ignore, info, warning, error
    
    Run Code Online (Sandbox Code Playgroud)

请注意,@internal与其他类似的注释 ( @visibleForTesting@protected) 一样,注释是元包的一部分,它包含在 Flutter Sdk 中,但必须作为依赖项包含在 pure-dart 包中。


Rém*_*let 5

你有几种可能: