184 个版本 (稳定版)
新 2.3.0 | 2024 年 8 月 18 日 |
---|---|
2.1.0 | 2024 年 7 月 6 日 |
2.0.0-dev.29 | 2024 年 3 月 31 日 |
2.0.0-dev.9 | 2023 年 12 月 31 日 |
1.8.0 | 2021 年 11 月 27 日 |
#102 在 FFI
99,332 每月下载量
1.5MB
25K SLoC
flutter_rust_bridge v2: 功能丰富,但无缝且简单的 Flutter/Dart <-> Rust 绑定生成器。
2.0 版本新特性
点击展开
- 从 1.x 到 2.0.0-dev.0
- 快速设置:只需一行命令即可集成到项目中。
- 任意类型:无需手动干预,使用任意的 Rust 和 Dart 类型,即使它们不是可序列化或不可克隆的(之前需要一些手动干预)。
- 异步 Rust:支持异步 Rust(`async fn`),除了同步 Rust / 异步 Dart / 同步 Dart。
- Rust 调用 Dart:允许 Rust 调用 Dart 函数(之前只允许 Dart 调用 Rust)。
- 支持整个文件夹作为输入:之前只支持单个文件(例如 `api.rs`)。
- 使用 Flutter/Rust 中的库/工具:所有现有库、Flutter 调试器等。没有任何阻止你使用它们的东西。
- 从 2.0.0-dev.0 到 2.0.0
- 解析第三方包:在 Dart 中扫描和使用现有的 Rust 包(实验性)。
- 生命周期:支持返回具有生命周期指定符的类型(实验性)。
- 特质:支持将特质用作基类和特质对象。
- 新的编解码器:一个新的编解码器
SSE
,在某些工作负载下速度快了几倍。 - 其他(>200 PRs):自动和手动访问器、对象代理、用户定义的序列化器、开发者体验、无死锁的自动锁定、Rust 初始化器、内置电池、重命名和忽略、改进流、更多类型等。
请访问此页面获取更多信息及更新指南。
🍀 这是啥?
- 只需写下正常的Rust代码(即使有任意类型、闭包、
&mut
、异步、特质等) - 然后在Flutter中调用它,就像Rust代码是正常的Flutter代码一样
- 桥接器将生成所有中间的粘合剂
📚 快速入门
通过运行创建一个可工作的Flutter + Rust应用程序并实时查看
cargo install flutter_rust_bridge_codegen && flutter_rust_bridge_codegen create my_app && cd my_app && flutter run
展开可选步骤
(可选) 编辑rust/src/api/simple.rs
(例如 Hello
-> Hi
),然后通过以下方式查看更改:
flutter_rust_bridge_codegen generate && flutter run
有关更详细的快速入门,请访问此页面。
🚀 优势

1. 官方Flutter Favorite
该包是官方Flutter Favorite,在其重启的第一批7个包之一。(另一个链接)
2. 简单性
(点击展开) 快速设置,自然编写代码,使用Flutter/Rust中的库/工具,电池内置
- 快速设置:只需一行命令即可集成到项目中。
- 自然编写代码:使用你的直觉编写你想要的代码。桥接器理解许多高级语法(见下文),允许无缝从Dart调用Rust。
- 使用 Flutter/Rust 中的库/工具:所有现有库、Flutter 调试器等。没有任何阻止你使用它们的东西。
- 电池内置:即使是像日志记录和启用回溯这样的小事情也在启动包中进行了配置。
3. 强大
(点击展开) 随意类型,异步 & 同步,双向道路,自动可翻译类型,解析第三方包,自动安全,可定制 & 硬件模式,跨平台,...
- 随意类型:无需手动干预即可使用任意的Rust和Dart类型,即使它们不是可序列化的或不可克隆的。
- 异步 & 同步 x Rust & Dart:多模式满足各种需求 - 异步Dart以避免阻塞主线程,同步Dart用于需要的地方(例如Widget.build);异步Rust用于I/O密集型任务,线程池用于CPU密集型计算。
- 双向道路:不仅Dart可以调用Rust,Rust也可以调用Dart。
- 自动可翻译类型:许多类型可以进一步翻译为Dart原生类型,例如复杂的
enum
和struct
、零拷贝的大数组、错误(Result
)和Stream
(迭代器)。 - 解析第三方包:在 Dart 中扫描和使用现有的 Rust 包(实验性)。
- 自动安全:专注于你的代码,完全忘记内存安全、malloc/free或未定义行为。
- 可定制 & 硬件模式:提供合理的默认值,但(加载器、处理器、...)一切都可以定制。你甚至可以抛弃所有内容,只使用最少的调用。
- 跨平台:支持Android、iOS、Windows、Linux、MacOS和Web。
- 其他功能,例如支持整个文件夹作为输入、纯Dart兼容、实例和静态方法、...
4. 可靠性
(点击展开) 稳定的CI,被许多人使用,易于审查,快速,可黑客攻击,提问
- 稳定的CI:Valgrind & sanitizers(ASAN/MSAN/LSAN)用于内存/UB相关错误,针对每个平台和模式进行测试,基准测试,测试覆盖率,发布后,等等,所有这些都由CI保证。
- 被许多人使用:请参阅此处的不完整列表。
- 易于代码审查 & 使自己信服:此包简单地模拟人类编写样板代码的方式。如果你想让自己(或你的团队)信服它是安全的,追踪的代码并不多。
- 快速:它只是一个薄薄(尽管功能丰富)的包装,在CI上进行了基准测试,甚至在不同的工作负载下都有多个编解码器以获得最佳性能。
- 可定制:如果您(出于任何原因)想修改源代码,这里有贡献者指南,代码模块化,执行逻辑直观。
- 提问:请在问题跟踪器中自由提问,我通常在几小时内回复(除非我在睡觉)。
为什么选择Flutter + Rust?
点击展开
首先,简要介绍每个组件(您可以在许多博客和文章中找到更多信息)
典型的结合场景包括
- Rust的UI框架:当您需要Rust系统的UI框架时。
- 在Flutter中使用任意Rust库:当所需的功能只在Rust库中有,而不是在Dart(Flutter)中时。
- 需要为Flutter编写高性能代码:Rust使得编写多线程代码、算法、密集型操作、SIMD代码等变得容易且性能出色。
- ...
✨ 展示代码
示例1
简单的Rust...
fn f(a: String, b: Vec<MyEnum>) -> MyStruct { ... }
...从Dart中调用,无需手动干预。
print(f(a: 'Hello', b: [MyEnum.c('Tom')]));
示例2
假设我们在Rust中实现一个单词词典
// ↱ Arbitrarily fancy Rust types
pub struct WordDict { .. }
// ↱ Support functions & methods
impl WordDict {
// ↱ Can call Dart back ↱ Translate errors
pub fn open(chooser: impl Fn(String) -> bool) -> Result<WordDict> { .. }
// ↱ Support async & sync Dart; property getter
#[frb(sync, getter)]
// ↱ Support T/&T/&mut T
pub fn size(&self) -> u32 { .. }
// ↱ Allow async & sync ↱ Support stream (iterator)
pub async fn search(&self, keyword: String, sink: StreamSink<String>) { .. }
}
仍然可以无缝在Dart中调用
final dict = await WordDict.open((situation) => true);
print(dict.size);
await for (final value in dict.search('something')) { print(value); }
这里没有涵盖许多其他功能,例如解析第三方包、生命周期、特质、自动访问器、代理等。
💡 文档
📎 P.S. 无论Flutter应用在构建/布局方面多么糟糕,都能达到约60 FPS。
这是我的另一个开源库 :) https://github.com/fzyzcjy/flutter_smooth.
✨ 致谢和贡献者
首先,我要衷心感谢Dart、Flutter和Rust(按字母顺序排列)。Dart为高效的UI开发提供了坚实的基础,Flutter让开发者轻松地创建跨平台应用,而Rust让每个人都能构建可靠高效的软件。没有这些语言和框架,这座桥梁就毫无意义。此外,我还要感谢授予该包官方Flutter喜爱荣誉。此外,我还要感谢Dart、Flutter和Rust团队以及社区成员,他们通过有价值的讨论、见解和行动帮助我在flutter_rust_bridge的开发过程中。
其次,感谢以下优秀的贡献者(遵循emoji键的all-contributors规范)
特别感谢所有这些贡献
- Desdaemon: 不仅支持简单的枚举,还支持具有字段的枚举,在Dart中将其转换为本地枚举或密封的freezed类。将Option类型作为Dart中的可空类型。支持String类型的Vec。支持元组类型。支持代码中的注释。添加标记属性以供将来使用。为with-flutter示例添加Linux和Windows支持,并使CI工作。避免参数冲突。彻底重构文档,并添加几章来演示在所有五个平台上配置Flutter+Rust项目。重构命令模块。预编译二进制CI工作流程。修复错误。添加对Web平台的支持,与现有的移动/桌面平台并行,通过WASM和JavaScript作为中间值。GitHub重试操作。实现不可见类型的草案。重构Boxed和Option。实现日期列表和可选类型。参数默认值。重构CLI。重构代码生成错误。重构以提高性能。
- rogurotus: 添加Rust不可见类型,使任意Rust结构体可以通过生成包装器和原始Arc指针用作不可见的Dart对象。同时添加Dart不可见类型,允许在Rust代码中使用任何Dart对象。扩展
SyncReturn
以支持更多类型。修复生成错误。修复SyncReturn。迁移到dart-sys。更新CI。修复linters。修复SyncReturn错误。 - ngasull: 使同步模式支持古典异步模式支持的所有类型。提高SDK版本。
- SecondFlight: 通过创建源图允许从crate内的其他文件导入结构和枚举。自动创建相关目录。使用ffigen 6.0修复
store_dart_post_cobject
错误。 - lattice0: 实现异常的层次结构。支持方法,使Rust结构体的实现可以转换为Dart类方法。在任何参数上支持StreamSink。
- Unoqwy: 添加结构体镜像,使得外部crate中的类型可以导入和使用,而无需重新定义和复制。
- antonok-edm: 在解析之前将syn类型转换为字符串以改进代码并使其更健壮。
- sagudev: 使代码生成器成为
lib
。添加错误类型。依赖于cbindgen
。修复LLVM路径。更新依赖项。修复CI错误。 - surban: 支持单元返回类型。跳过不可解析的模块。忽略prefer_const_constructors。非最终Dart字段。
- Roms1383: 修复build_runner调用错误。删除全局
ffigen
依赖项。改进版本检查。修复枚举名称-变体冲突。支持Chrono日期时间和UUID类型。迁移到Rust 1.64工作空间。更新和重构CI。更新头注释。代码清理。 - dbsxdbsx:允许生成多个Rust和Dart文件。修复代码检查。更新文档。添加日志。放宽配置。方法前缀。
- GregoryConrad:为在Dart/Flutter库中设置frb添加文档。
- huang12zheng:支持类型别名和嵌套别名。微调代码生成。修复Mac上的rust_build_and_test。改进CI逻辑和缓存。移除模型中的桥接字段。
- trobanga:添加对
[T;N]
结构的支持。添加对usize
的支持。添加一个命令行参数。分离Dart测试。修复可能失败的列表情况。修复测试编译。修复Result + RustAutoOpaque。 - MnlPhlp:支持宏并将自动展开。允许在流中使用镜像类型。
- SoLongAndThanksForAllThePizza:重构并增强SyncReturn以支持更多类型。重构发布后的CI。
- hsfzxjy:修复SyncReturn使用后释放的bug。
- Cupnfish:支持数组作为函数参数。允许多镜像。
- alanlzhang:添加Dart元数据的生成。增强和修复模块解析器。修复结构体中的枚举。修复代码检查器。改进提示。
- erikas-taroza:支持原始枚举的列表。使枚举为camelCase。警告错误路径。修复cargo expand。
- SiongSng:完成异常层次结构的实现。修复SyncReturn的bug。
- JustSimplyKyle:也完成异常层次结构的实现。允许忽略函数。
- Zaitam:修复方法返回结构体时的问题。部分迁移到Dart 3。
- coder0xff:讨论绑定未修改的Rust。重构SupportedInnerType。额外的代码生成测试器。
- NobodyForNothing:部分支持impl-for。
- nitn3lav:没有使用
Box
的嵌套struct
。 - mcmah309:添加cli插件脚手架生成。
- AlienKevin:添加macOS的flutter示例。添加关于Android NDK错误的文档。改进迁移文档。
- alexthe2:添加Option Datetime。添加空结构体。改进文档。添加
r#
。修复镜像枚举的bug。 - Larpoux:修复异步生成。更新web-audio-api绑定。
- banool:修复pubspec解析。修复符号剥离文档。
- anlumo:修复freezed + methods。非克隆RustOpaque。
- temeddix:修复损坏的CI。自定义工作线程数。修复MacOS文档步骤。更新文档。使零拷贝默认。
- NightFeather0615:修复Vec bool。
- OfficialBoyfriend:修复错误显示。
- wxitcode:添加org选项。支持macOS日志。修复一个拼写错误。
- Tienisto:添加mock初始化。
- Markus43:修复文件夹删除。
- Krysl:添加前言。
- w-ensink:改进文档。修复CI。重构。添加测试。
- smw-wagnerma:改进Windows编码处理。
- powpingdone:记录JNI初始化和libc++_static链接。
- debanjanbasu:记录备选NDK初始化。
- valeth:重命名callFfi的端口。
- sccheruku:防止重复生成工具。
- upsuper:重构delegate-attr。
- jsonmona:添加导入。
- MateusHBR:添加pub get。
- codercengiz:修复镜像错误。
- aran:修复map + mirror。修复pubspec。升级ffigen。替换为js_interop。版本升级。修复拼写错误。
- Michael-F-Bryan:检测损坏的绑定。
- patmuk:设置MSRV。快速失败。改进消息。改进文档。
- phlip9:修复no-serde编译错误。
- SilverMira:修复StreamSink。
- h3x4d3c1m4l:修复文件夹外的情况。
- HalidOdat:改进配置方法。提示build.rs。
- Berrysoft:修复缺失的符号。
- bus710:在故障排除中添加一个案例。
- Demezy:提及故障排除。
- gutenfries:升级proc-macros。
- anstadnik:检查关键词。
- syndim:在box中添加一个括号。
- vhdirk:支持虚线crate。
- rhian-cs:添加Cargo工作区文档。
- TENX-S:改进文档。重现一个错误。
- polypixeldev:改进文档。
- CicadaCinema:版本升级。改进文档。
- CosmicHorrorDev:更改依赖项。
- akashgurava:部分修复。
- w1th0utnam3:改进消息。
- vincent-herlemont:放宽版本。
- canxin121:修复权限问题。
- pixelshot91:更新cargokit。修复文档链接。
- TrackerSB:升级allo-isolate。
- Dampfwalze:改进文档。
- samuel-cavalcanti:改进文档。
- zaynetro:改进文档。
- raphaelrobert:删除过时的文档。
- DMouayad:改进文档。
- elliotsayes:改进文档。
- tmpfs:改进文档。
- thomas725:改进文档。
- juzi5201314:改进文档。
- Voklen:改进文档。
- svenstaro:改进文档。
- utilForever:修复拼写错误。
- not-holar:修复拼写错误。
- Stonks3141:修复文档信用。
- mattiasgronlund:版本升级。
- adsouza:修复文档语法。
- vimaxwell:修复文档链接。
- lker-dev:修复文档链接。
- jaiakash:修复文档链接。
- feber:修复文档链接。
- satvikpendem:轻微合作 #989。
- damywise:修复一个错别字。
- rustui:修复一个错别字。
- escwxyz:修复一个错别字。
- eltociear:修复一个错别字。
- thesimplekid:修复一个错别字。
依赖项
~15–28MB
~441K SLoC