VarArgs<T extends Record>抽象 最终

C中传递的可变参数的类型。

NativeFunction 中的签名需要指定 FFI 调用中使用的每个实际参数的确切类型。

例如,考虑 C 中的 printf 调用。

int printf(const char *format, ...);

void call_printf() {
  int a = 4;
  double b = 5.5;
  const char* format = "...";
  printf(format, a, b);
}

要直接从 Dart 使用这两种参数类型调用 printf,定义如下原生类型

/// `int printf(const char *format, ...)` with `int` and `double` as
/// varargs.
typedef NativePrintfIntDouble =
    Int Function(Pointer<Char>, VarArgs<(Int, Double)>);

注意 VarArgs 类型参数中的记录类型。

如果只传递单个可变参数,记录类型必须包含一个尾随逗号

/// `int printf(const char *format, ...)` with only `int` as varargs.
typedef NativePrintfInt = Int Function(Pointer<Char>, VarArgs<(Int,)>);

当使用不同的可变参数类型调用可变函数时,需要创建多个绑定。为了避免为相同的符号进行多次 DynamicLibrary.lookup,可以转换符号的指针

final dylib = DynamicLibrary.executable();
final printfPointer = dylib.lookup('printf');
final void Function(Pointer<Char>, int, double) printfIntDouble =
    printfPointer.cast<NativeFunction<NativePrintfIntDouble>>().asFunction();
final void Function(Pointer<Char>, int) printfInt =
    printfPointer.cast<NativeFunction<NativePrintfInt>>().asFunction();

如果没有传递可变参数,必须使用空记录类型传递 VarArgs

/// `int printf(const char *format, ...)` with no varargs.
typedef NativePrintfNoVarArgs = Int Function(Pointer<Char>, VarArgs<()>);

VarArgs 必须是最后一个参数。

VarArgs 在 Dart 代码中不可构造,仅作为类型签名中的标记。

实现类型
注解
  • @Since('3.0')

属性

hashCode int
该对象的哈希码。
无设置器继承
runtimeType Type
该对象运行时类型的表示。
无设置器继承

方法

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

运算符

operator ==(Object other) bool
等于运算符。
继承