【问题标题】:Dart Package - How to hide internal methods in public classes?Dart 包 - 如何在公共类中隐藏内部方法?
【发布时间】:2022-01-04 03:53:00
【问题描述】:

我正在 Flutter 上开发一个包。

类中有一些方法只对包本身有用,而不是对将要导入我的包的程序员有用,是否可以将这些方法隐藏在公共类中以进一步实现?

我正在尝试使用 @internal 注释,但我仍然可以看到在包外部标记为内部的方法。

例子:

/// Base abstract class [ImageData]
abstract class ImageData  {
  /// Create [ImageData] instance.
  const ImageData();

  /// Create [ImageData] instance from [dto].
  ///
  /// by converting from [dto.ImageData].
  @internal
  factory ImageData.fromDto(dto.ImageData object) {
    switch (object.type) {
      case dto.ImageData_Type.pathType:
        return PathImageData(path: object.path);
      case dto.ImageData_Type.rawImageType:
        return RawImageData.fromDto(object.rawImage);
      default:
        throw const PluginInvokeException();
    }
  }

  /// Create [dto.ImageData] from current instance.
  @internal
  dto.ImageData toDto();

}

以及来自这个ImageData的其他继承者

class RawImageData extends ImageData {
  /// Bytes of image.
  final Uint8List data;

  /// Describe type of [data] content.
  final RawImageDataType type;

  /// Wight of image
  final int width;

  /// Height of image
  final int height;

  /// Create [RawImageData] instance.
  const RawImageData({
    required this.data,
    required this.type,
    required this.width,
    required this.height,
  }) : super();

  /// Create [RawImageData] instance from [dto].
  ///
  /// by converting from [dto.RawImage].
  @internal
  factory RawImageData.fromDto(dto.RawImage object) {
    return RawImageData(
      data: Uint8List.fromList(object.raw),
      type: typeFromDtoEnum(object.type),
      width: object.size.width,
      height: object.size.height,
    );
  }

  @override
  @internal
  dto.ImageData toDto() {
    return dto.ImageData(
      type: dto.ImageData_Type.rawImageType,
      rawImage: toDtoRawImage(),
    );
  }

}

但我仍然可以看到在包外部标记为内部的方法。如何将这个方法私有化只用于外部包命名空间?

【问题讨论】:

    标签: flutter dart package


    【解决方案1】:

    Dart 标识符是:

    • 公开
    • 如果前缀为下划线 (_),则为库私有。

    就是这样。

    @protected@internal 等注解为 Dart 分析器提供了额外的提示。它们不会在编译时强制执行(除非您明确地使构建系统因分析警告/错误而失败),也不会在运行时强制执行。 (这也是为什么 null-safe Dart 需要一个新的 required 语言关键字并且不能使用旧的 @required 注释。)

    要么接受依赖分析警告,要么将 toDto 重命名为 _toDto 以使其私有化。由于私有标识符对 Dart 是私有的,因此需要:

    • 将所有代码移动到同一个.dart 文件中。
    • library 显式声明一个Dart 库,并使用part/part of 指定构成该库的.dart 文件。

    另一种隐藏包特定标识符的技术是将它们公开,但将它们放在包内部的.dart 文件中(期望客户端不会明确地import 它)。但是,这对您的情况不太有用。

    【讨论】:

    • 它将对我的包的方法进行私有化,但我询问如何仅将这些方法私有化为外部包命名空间。
    • @EvGeniyIlyin 我不明白。正如我所说,只有公共图书馆和私人图书馆。
    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2020-01-15
    • 2010-10-17
    相关资源
    最近更新 更多