Flutter 可以更直接地调用原生 API 了,Dart Direct Native Interop 最近刚好有网友聊这个就展开聊聊吧严格来说Direct Native Interop确实不算是最近更新的 整个时间线大概类似2024 年Dart 3.5 开始在完善 C、Java、Kotlin、Objective-C 的直接互操作能力2025 年 5 月Dart 3.8 正式宣布 FFIgen、JNIgen 的 Direct Native Interop 早期体验计划2026 年官方文档已经把 C、Java、Objective-C/Swift 和 JavaScript 的互操作方式整合到 dart.dev/interop同时开始持续完善相关工具链当然这两年确实变化很多比如调用路径变了Dart 可以绕开传统 Platform Channel 的消息传递流程直接通过 FFI/JNI 调用原生方法代码生成方式变了FFIgen 和 JNIgen 可以根据原生接口生成 Dart Binding开发者不需要自己维护 Kotlin、Swift 桥接代码的工作Flutter 的线程架构也配合做了调整UI 线程和 Platform 线程的合并整个聊过很多次了特别是 2026 年多了一个 Pigeon 29这个版本正式加入了实验性的 FFI/JNI Direct Native Interop 支持也就是 Native Interop 调用系统的实现应该差不多要规模化落地了。也就是Dart - 生成的 Binding - JNI / FFI - Kotlin / Swift 这个双向路径以后会是主流。你现在其实也可以在 Pigeon 配置里开启ConfigurePigeon( PigeonOptions( kotlinOptions: KotlinOptions(useJni: true), swiftOptions: SwiftOptions( useFfi: true, ffiModuleName: Runner, ), ), )然后运行dart run pigeon,工具就会进一步调用jnigen/ffigen生成对应的 Kotlin、Swift 桥接代码和 Dart Binding。所以其实 Direct Native Interop 很早就有了不过 9 月之后已经开始进入 Pigeon。对比MethodChannel / 传统 PigeonDirect FFI / JNI调用方式发送消息等待结果调用生成的原生绑定方法编解码StandardMessageCodec原生类型、对象引用及必要转换Flutter Engine 消息通道经过不经过同步调用Dart 侧异步等待支持同步调用线程通过消息机制调度在调用者所在 OS 线程执行数据传递编码、解码可能多次复制减少复制但不保证零拷贝开发难度低生态成熟绑定生成、生命周期、构建更复杂Pigeon 直连支持Android、iOS、macOS、Windows、Linux 的传统通道目前为 Android、iOS、macOS实验性比如用了 JNIgen 后就可以直接根据 Java 接口生成 Dart Binding你就可以像下面这样这段 Dart 调用会通过 JNI 直接走到 Java VM 执行import example.dart; // JNIgen 生成的 Binding ​ void main() { print(Example.sum(17, 25)); // 42 }而且 FFIgen 可以把 Objective-C API 直接变成 Dart API 比如用AVAudioPlayer做例子FFIgen 读取AVAudioPlayer.h生成对应 Dart Binding 后就可以这样操作原生对象final fileUrl NSURL.fileURLWithPath( NSString(/path/to/audio.mp3), ); ​ final player AVAudioPlayer.alloc().initWithContentsOfURL(fileUrl); ​ player?.play();不过 Swift 比 Objective-C 麻烦一些因为 Dart FFI 面向 C ABI所以目前还是需要通过 Objective-C 兼容接口衔接 Swiftobjc public class SwiftClass: NSObject { objc public func sayHello() - String { return Hello from Swift! } }另外 Dart 3.13 之前也聊过现在加入了RecordUse和package:record_use可以让原生 FFI Binding 参与 到 AOT 编译期间的可达性分析。以前 Dart 层的没有用包装函数可以被 Tree Shaking 删除但 Native Library 需要整体打包现在配合 Link Hook 和支持裁剪的原生工具链就可以进一步剔除没有用到的 Native Symbol从而优化产物大小。这对依赖 SQLite、加密库、音视频库的插件也有意义不过它需要相应的构建和链接配置不是说升级 Dart 后任何原生库都会自动完成裁剪。总体里说这个功能支持是非常不错的就是拖的有点久了。