Native<T>final

将外部声明与其本地实现绑定的注解。

只能应用于静态和顶级函数及变量的 external 声明。

带有 Native 注解的 external 函数由本地代码实现。该实现在指定的 assetId 指示的本地库中查找。类似地,带有 Native 注解的 external 变量通过从或向本地内存读取/写入来实现。

编译器和/或运行时提供从 assetId 到本地库的绑定,这取决于目标平台。编译器/运行时然后可以对本地库进行符号(标识符)解析/查找,以找到本地函数或本地全局变量,并将 Dart 中的 external 函数或变量声明绑定到该本地声明。默认情况下,运行时期望本地符号与 Dart 中注解的函数或变量具有相同的名称。这可以通过注解上的 symbol 参数来覆盖。

如果此注解用于函数,则 Native 注解的类型参数 T 必须是表示本地函数参数和返回类型的函数类型。参数和返回类型必须是 NativeType 的子类型。

如果此注解用于外部变量,则类型参数 T 必须是与本地类型兼容的本地类型。例如,一个 int 字段可以用 Int32 标注。如果省略 @Native 的类型参数,则默认为注解声明的 Dart 类型,而该类型必须是本地类型。这对于函数声明将不会起作用,但可以应用于类型是此库中的某些类型的变量,例如 Pointer。对于无法重新分配的本地全局变量,可以使用 Dart 中的 final 变量或 getter 来防止对本地字段的分配。

示例

@Native<Int64 Function(Int64, Int64)>()
external int sum(int a, int b);

@Native<Int64>()
external int aGlobalInt;

@Native()
external final Pointer<Char> aGlobalString;

调用 @Native 函数,以及读取或写入 @Native 变量,将尝试在以下顺序中解析(在)

  1. 提供的或默认的 assetId
  2. dart_api.h 中通过 Dart_SetFfiNativeResolver 设置的本地解析器,以及
  3. 当前进程。

这三个中的至少一个必须为符号提供绑定,否则方法调用或变量访问会失败。

注意:这是一个实验性功能,将来可能会发生变化。

注解
  • @Since('2.19')

构造函数

Native({String? assetId, bool isLeaf = false, String? symbol})
const

属性

assetId String?
如果未使用默认值,则解析 symbol 的资产 ID。
final
hashCode int
该对象的哈希码。
no setterinherited
isLeaf bool
函数是否为叶函数。
final
runtimeType Type
表示对象运行时类型的表示。
no setterinherited
symbol String?
要解决的本地符号,如果未使用默认值。
final

方法

noSuchMethod(Invocation invocation) → dynamic
当访问不存在的方法或属性时调用。
继承
toString() String
此对象的字符串表示形式。
继承

操作符

operator ==(Object other) bool
等于操作符。
继承

静态方法

addressOf<T extends NativeType>(Object native) Pointer<T>
实现 native 的本地地址。