164次发布 (稳定)
新 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.10.0 | 2021年12月31日 |
#14 在 #binding-generator
每月70,811次下载
在 2 个crate中使用 (通过 flutter_rust_bridge)
70KB
155 行
flutter_rust_bridge v2: Flutter/Dart <-> Rust 绑定生成器,功能丰富,但无缝且简单。
V2中的新功能
点击展开
- 从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. 实现 ~60 FPS,无论 Flutter 应用的构建/布局有多糟糕
这是我另一个开源库 :) https://github.com/fzyzcjy/flutter_smooth。
✨ 致谢和贡献者
首先,我想衷心感谢 Dart、Flutter 和 Rust(按字母顺序排列)。Dart 为高效的 UI 开发提供了坚实的基础,Flutter 使开发者能够轻松地创建跨平台应用程序,而 Rust 则赋予每个人构建可靠和高效软件的能力。没有这些语言和框架,这个桥梁将连接不到任何东西。此外,我还想表达对授予该包官方 Flutter Favorite 荣誉的感谢。此外,我还要感谢 Dart、Flutter 和 Rust 团队成员以及社区成员,他们在开发 flutter_rust_bridge 期间通过有价值的讨论、见解和行动帮助了我。
其次,感谢这些优秀的贡献者(以下 emoji key 遵循 all-contributors 规范)
更具体地说,感谢所有的这些贡献
- Desdaemon:不仅支持简单的枚举,还支持具有字段的枚举,这些字段在Dart中被转换为本地枚举或密封的冻结类。支持Dart中的可选类型作为可空类型。支持字符串类型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。非final Dart字段。
- Roms1383:修复build_runner调用错误。删除全局
ffigen
依赖。改进版本检查。修复枚举名称-变体冲突。支持Chrono日期时间和UUID类型。迁移到Rust 1.64工作区。更新和重构CI。更新头注释。代码清理。 - dbsxdbsx:允许生成多个Rust和Dart文件。修复lint。更新文档。添加日志。放宽配置。方法前缀。
- GregoryConrad:为Dart/Flutter库内设置frb添加文档。
- huang12zheng:支持类型别名和嵌套别名。调整代码生成。修复Mac上的rust_build_and_test。改进CI逻辑和缓存。移除模型中的桥梁字段。
- trobanga:添加对
[T;N]
结构体的支持。添加usize
支持。添加命令行参数。分离 Dart 测试。修复可失败列表情况。修复测试编译。修复 Result + RustAutoOpaque。 - MnlPhlp:支持宏并自动展开。允许在流中使用镜像类型。
- SoLongAndThanksForAllThePizza:重构并增强 SyncReturn 以支持更多类型。重构发布后 CI。
- hsfzxjy:修复 SyncReturn 使用后释放的漏洞。
- Cupnfish:支持将数组作为函数参数。允许多镜像。
- alanlzhang:添加 Dart 元数据的生成。增强和修复模块解析器。修复结构体中的枚举。修复代码检查器。改进提示。
- erikas-taroza:支持原始枚举的列表。将枚举改为驼峰式命名。警告错误路径。修复 cargo expand。
- SiongSng:完成异常层次结构的实现。修复 SyncReturn 漏洞。
- JustSimplyKyle:也完成异常层次结构的实现。允许忽略函数。
- Zaitam:修复当方法返回结构体时的情况。部分迁移到 Dart 3。
- coder0xff:讨论绑定未修改的 Rust。重构 SupportedInnerType。额外的代码生成测试器。
- NobodyForNothing:部分支持 impl-for。
- nitn3lav:无需使用
Box
的嵌套struct
。 - mcmah309:添加 CLI 插件脚手架生成。
- AlienKevin:添加 macOS 的 flutter 示例。添加 Android NDK 漏洞文档。改进迁移文档。
- alexthe2:添加 Option Datetime。添加空结构体。改进文档。添加
r#
。修复镜像枚举漏洞。 - Larpoux:修复异步生成。更新 web-audio-api 绑定。
- banool:修复 pubspec 解析。修复符号剥离文档。
- anlumo:修复 freezed + 方法。非克隆 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:修复地图和镜像。修复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:支持dashed crate。
- rhian-cs:添加Cargo workspace文档。
- 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:修复一个错别字。
依赖项
~0.6–1.1MB
~26K SLoC