dart 如何隐藏内部方法和类?

2j4z5cfb  于 2023-02-06  发布在  其他
关注(0)|答案(4)|浏览(271)

我正在开发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 {
   ...
}
ddrv8njm

ddrv8njm1#

拥有仅限包声明的通常方法是将它们放在lib/src/目录下的库中,并且不导出该库。包中的其他库可以 import 仅限包的库,但是不鼓励包外的用户直接导入lib/src/中的库。(这不是不可能的,只是不鼓励这样做,因为软件包可以在没有警告的情况下自由地更改这些库)。
如果只有包的特性需要访问公共类的库私有部分,那么它们需要在同一个库中。传统的方法是在lib/src/的库中声明这两个特性,然后只导出库中需要公共的部分:

library myPackage;
export "src/allDeclarations.dart" hide Private, Declarations;
// or, preferably, 
export "src/allDeclarations.dart" show Public, Things;

一般来说,只有在绝对必要的情况下,才应该将导出和非导出声明放在同一个库中,否则hide/show列表会变得太麻烦,并且很容易忘记hide列表中的声明。

fzwojiic

fzwojiic2#

您有几种可能性:

  • 通过在方法/变量前面加上_使其成为私有的:
class _InternalEvent {}
  • 使用hide/show指令:
// lib/src/event.dart
class InternalEvent {}

class VisibleEvent {}

// lib/my_package.dart
export 'src/event.dart' hide InternalEvent; 

OR

export 'src/event.dart' show VisibleEvent;
dohp0rv5

dohp0rv53#

对于包私有成员,存在注解**@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

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

yqyhoc1h

yqyhoc1h4#

它是如此简单假设我有一个下面的代码在src文件夹你的库,

class myClass1 {}
class myClass2 {}
class myClass3 {}

下面的导出语句将使所有3个类可见/可访问

export 'src/mylib_base.dart' ;

下面的export语句将使myClass 3可见/可访问,并保持不可访问

export 'src/mylib_base.dart' show myClass3 ;

下面的export语句将使myClass 3不可见/不可访问并保持可访问状态

export 'src/mylib_base.dart' hide myClass3 ;

如此简单
使用hide classes/function,隐藏您提到的类,其余的将显示给最终用户
使用show classes/function,可以显示您提到的内容,其余内容将对最终用户隐藏

相关问题