Dart/Flutter FFI:将列表转换为数组

Dart/Flutter FFI: Convert List to Array

我有一个从 C++ 库接收 Float 类型数组的结构。

class MyStruct extends Struct{      
  @Array.multi([12])
  external Array<Float> states;
}

我能够接收数据并在 Dart 中解析它。 现在我想反其道而行之。我有一个 List<double> 我想分配给这个结构并传递给 C++。

以下转换在 运行 次失败。

myStructObject.states = listObject as Array<Float>;

数组class和列表class都没有相关方法。对此有什么想法吗?

无法绕过将元素复制到 FFI 数组中。

for (var i = 0; i < listObject.length; i++) {
  my_struct.states[i] = listObject[i];
}

这可能看起来效率低下,但考虑到根据 listObject 的特殊化,数据的底层内存布局可能与连续的 FFI 布局有很大不同,因此 Dart 提供的类型转换糖将无论如何也可能需要对单个元素执行转换(而不是仅在幕后执行单个 memcpy)。

缩小便利性差距的一种可能性是定义扩展方法。例如:

extension FloatArrayFill<T> on ffi.Array<ffi.Float> {
  void fillFromList(List<T> list) {
    for (var i = 0; i < list.length; i++) {
      this[i] = list[i] as double;
    }
  }
}

用法:

my_struct.states.fillFromList(list);

请注意,需要为您要为其执行此操作的每个 ffi.Array<T> 专业化定义单独的扩展方法(Array<Uint32>Array<Double>Array<Bool>, ETC。)。 这是因为 [] 运算符是通过内部针对这些类型特化中的每一个的单独扩展方法实现的。