VarArgs<T extends Record>抽象 最终的

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

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

例如,在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')

构造函数

VarArgs()

属性

hashCode int
该对象的哈希码。
no setterinherited
runtimeType Type
表示对象运行时类型的表示。
no setterinherited

方法

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

运算符

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