Dart/Flutter FFI中List<double>转换为结构体Array<Float>的方法
问题本质
dart:ffi 中用于映射C数组的Array<T>类型,和Dart原生的List属于完全独立的类型体系,不存在继承关系,直接强转一定会报错。
同时你用@Array.multi([12])标注的结构体成员,指向的是结构体内部预分配的固定长度原生内存段,本身不支持整体替换引用——你没法给这个external字段重新赋值一个新的Array实例,只能操作这块内存里存储的具体元素。
正确实现方式
直接通过下标遍历,把List<double>里的元素逐个写入Array<Float>对应的内存位置即可,Array原生支持下标读写操作。
示例代码:
import 'dart:ffi'; // 省略MyStruct的FFI定义 // 假设listObject是你已有的长度为12的List<double>数据 final List<double> listObject = [/* 你的12个浮点数值 */]; // 遍历逐元素写入,注意数组长度要和@Array.multi声明的长度12匹配 for (int i = 0; i < 12; i++) { // 赋值时Dart会自动将double转为C侧要求的32位Float类型,无需手动转换 myStructObject.states[i] = listObject[i]; } // 赋值完成后即可正常将结构体传给C++接口调用
注意事项
- 写入前请确认源List长度和Array声明的固定长度一致,避免下标越界写入非法内存
- 此处的
Float必须是dart:ffi包下的类型,不要误用Dart其他库中的同名类型 - 永远不要尝试直接给
states字段整体赋值对象,该字段直接映射原生内存偏移,仅支持通过下标操作内部元素
内容的提问来源于stack exchange,提问作者Sanjay
相关产品推荐
相关产品推荐

