我正在开发Flutter应用程序包
有些方法和类只对包本身有用,而对将要导入我的包的程序员没用,是否可以隐藏这些方法和类以供进一步实现?
示例:
DataService.dart
export class DataService{
//Must be visible only for my library
static notifyDataChanged(InternalEvent internalEvent){ ... }
//Must be visible for anyone
static addCallbackOnDataChange(onDataChangeCallback) { ... }
}
InternalEvent.dart
//Must be visible only for my library as well
export class InternalEvent {
...
}
4条答案
按热度按时间ddrv8njm1#
拥有仅限包声明的通常方法是将它们放在
lib/src/
目录下的库中,并且不导出该库。包中的其他库可以 import 仅限包的库,但是不鼓励包外的用户直接导入lib/src/
中的库。(这不是不可能的,只是不鼓励这样做,因为软件包可以在没有警告的情况下自由地更改这些库)。如果只有包的特性需要访问公共类的库私有部分,那么它们需要在同一个库中。传统的方法是在
lib/src/
的库中声明这两个特性,然后只导出库中需要公共的部分:一般来说,只有在绝对必要的情况下,才应该将导出和非导出声明放在同一个库中,否则
hide
/show
列表会变得太麻烦,并且很容易忘记hide
列表中的声明。fzwojiic2#
您有几种可能性:
_
使其成为私有的:hide
/show
指令:dohp0rv53#
对于包私有成员,存在注解**
@internal
**。使用
@internal
,分析仪在以下情况下发出警告:*导出注解元素(从
lib
下的文件)*包的使用者导入带注解的元素
无论如何,Dart在我看来让事情变得非常复杂。成员既不完全公开,也不能从文件外部访问,这是最基本的要求,但没有解决方案提供确定性。注意:
lib/src
下的文件中,但是你的包的消费者仍然能够导入它们,甚至分析器都不会产生警告;它只是一种对流@internal
注解,分析器(即IDE,依赖于分析器)会产生一个警告,但无论如何,没有什么可以阻止您编译代码。如果您在不考虑注解时增加分析器产生的警告的严重性级别,情况会有所改善。要做到这一点,您需要创建一个analysis_options.dart文件,如下所示:请注意,
@internal
注解与其他类似注解(@visibleForTesting
、@protected
)一样,是 meta包的一部分,它包含在Flutter Sdk中,但必须作为依赖项包含在pure-dart包中。yqyhoc1h4#
它是如此简单假设我有一个下面的代码在src文件夹你的库,
下面的导出语句将使所有3个类可见/可访问
下面的export语句将使myClass 3可见/可访问,并保持不可访问
下面的export语句将使myClass 3不可见/不可访问并保持可访问状态
如此简单
使用hide classes/function,隐藏您提到的类,其余的将显示给最终用户
使用show classes/function,可以显示您提到的内容,其余内容将对最终用户隐藏