#dart #flutter #binding-generator #bindings #bindings-generator #code-generation

flutter_rust_bridge

Flutter/Dart 与 Rust 之间的高层内存安全绑定生成器

183 个版本 (稳定)

2.3.0 2024 年 8 月 18 日
2.1.0 2024 年 7 月 6 日
2.0.0-dev.292024 年 3 月 31 日
2.0.0-dev.92023 年 12 月 31 日
1.8.0 2021 年 11 月 27 日

FFI 中排名 #10

Download history 19412/week @ 2024-05-04 17329/week @ 2024-05-11 16831/week @ 2024-05-18 15585/week @ 2024-05-25 16330/week @ 2024-06-01 13285/week @ 2024-06-08 11692/week @ 2024-06-15 12072/week @ 2024-06-22 14896/week @ 2024-06-29 16826/week @ 2024-07-06 16963/week @ 2024-07-13 14743/week @ 2024-07-20 18083/week @ 2024-07-27 20056/week @ 2024-08-03 16410/week @ 2024-08-10 14625/week @ 2024-08-17

每月下载量 71,926
用于 medea-jason

MIT 许可证

245KB
4.5K SLoC

flutter_rust_bridge v2: Flutter/Dart 与 Rust 绑定生成器,功能丰富,但无缝且简单。

Rust Package Flutter Package Stars CI Post-Release codecov All Contributors Codacy Badge

Logo

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 用于 IO 密集型任务,线程池用于 CPU 密集型计算。
  • 双向路:不仅 Dart 可以调用 Rust - Rust 也可以调用 Dart。
  • 自动可翻译类型:许多类型可以进一步转换为 Dart 本地类型,例如复杂的 enumstruct,零拷贝大数组,错误(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?

点击展开

首先,简要介绍每个组件(您可以在很多博客和帖子中找到更多信息)

  • Flutter:跨平台、热重载、快速开发、灵活的 UI 工具包。
    • "最受欢迎的跨平台移动 SDK"(由 StackOverflow [1][2])。
  • Rust:高度高效和性能优越、可靠、高效。
    • "最受欢迎的编程语言"达 8 年之久(由 StackOverflow 和 GitHub [1][2])。

典型的结合场景包括

  • 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 keyall-contributors 规范)

fzyzcjy
fzyzcjy

💻 📖 💡 🤔 🚧
Viet Dinh
Viet Dinh

💻 ⚠️ 📖
rogurotus
rogurotus

💻 📖
Nicolas Gasull
Nicolas Gasull

💻
Joshua Wade
Joshua Wade

💻
Lattice 0
Lattice 0

💻 📖
Unoqwy
Unoqwy

💻
Anton Lazarev
Anton Lazarev

💻
sagu
sagu

💻 📖
Sebastian Urban
Sebastian Urban

💻
Rom's
Rom's

💻 📖
老董
老董

💻 📖
Gregory Conrad
Gregory Conrad

📖 💻
huang12zheng
huang12zheng

💻 📖
Daniel
Daniel

💻
Manuel Philipp
Manuel Philipp

💻 📖
SoLongAnd...
SoLongAnd...

💻 📖
hsfzxjy
hsfzxjy

💻
Cupnfish
Cupnfish

💻
alanlzhang
alanlzhang

💻 📖
Erikas Taroza
Erikas Taroza

💻
菘菘
菘菘

💻
SimplyKyle!
SimplyKyle!

💻
Zaitam
Zaitam

💻
Brent Lewis
Brent Lewis

💻 📖
derdilla
derdilla

💻 📖
nitn3lav
nitn3lav

💻 📖
Henry
Henry

💻
Kevin Li
Kevin Li

💻 📖
Alex Procelewski
Alex Procelewski

📖 💻
Larpoux
Larpoux

💻
Daniel Porteous (dport)
Daniel Porteous (dport)

📖
Andreas Monitzer
Andreas Monitzer

💻
Kim Dong-Hyun
Kim Dong-Hyun

💻 📖
NightFeather
NightFeather

💻
九月
九月

💻
wxitcode
wxitcode

📖
Tien Do Nam
Tien Do Nam

💻
Markus
Markus

💻
Krysl
Krysl

💻
Wouter Ensink
Wouter Ensink

📖
Marcel
Marcel

💻
Aidan
Aidan

📖
Debanjan Basu
Debanjan Basu

📖
Patrick Auernig
Patrick Auernig

💻
Sai Chaitanya
Sai Chaitanya

💻
Xidorn Quan
Xidorn Quan

💻
jsonmona
jsonmona

💻
mtz
mtz

💻
codercengiz
codercengiz

💻
Aran Donohue
Aran Donohue

💻
Michael Bryan
Michael Bryan

💻
Patrick Mukherjee
Patrick Mukherjee

💻
Philip Kannegaard Hayes
Philip Kannegaard Hayes

💻
SilverMira
SilverMira

💻
Sander in 't Hout
Sander in 't Hout

💻
Haled Odat
Haled Odat

💻
王宇逸
王宇逸

💻
bus710
bus710

📖
._.
._.

📖
Marc Gutenberger
Marc Gutenberger

💻
Andrii Stadnik
Andrii Stadnik

💻
syndim
syndim

💻
Dirk Van Haerenborgh
Dirk Van Haerenborgh

💻
Rhian Moraes
Rhian Moraes

📖
Ares Andrew
Ares Andrew

📖
polypixeldev
polypixeldev

📖
CicadaCinema
CicadaCinema

💻 📖
CosmicHorror
CosmicHorror

💻
Akash Gurava
Akash Gurava

💻
Fabian Löschner
Fabian Löschner

💻
Vincent Herlemont
Vincent Herlemont

💻
canxin
canxin

💻
pixelshot91
pixelshot91

📖
TrackerSB
TrackerSB

💻
Dampfwalze
Dampfwalze

📖
Samuel Cavalcanti
Samuel Cavalcanti

📖
Roman Zaynetdinov
Roman Zaynetdinov

📖
raphaelrobert
raphaelrobert

📖
Mouayad Alhamwi
Mouayad Alhamwi

📖
elliotsayes
elliotsayes

📖
muji
muji

📖
thomas725
thomas725

📖
orange soeur
orange soeur

📖
Alex Gorichev
Alex Gorichev

📖
Sven-Hendrik Haase
Sven-Hendrik Haase

📖
Chris Ohk
Chris Ohk

📖
Vitalii Hurianov
Vitalii Hurianov

📖
Sam Nystrom
Sam Nystrom

📖
mattiasgronlund
mattiasgronlund

💻
Antonio D'souza
Antonio D'souza

📖
max
max

📖
Jonathan
Jonathan

📖
Akash Jaiswal
Akash Jaiswal

📖
Febrian Setianto
Febrian Setianto

📖
Satvik Pendem
Satvik Pendem

💻
Damien Wise
Damien Wise

📖
rustui
rustui

📖
J
J

📖
Ikko Ashimine
Ikko Ashimine

📖
thesimplekid
thesimplekid

📖

More specifically, thanks for all these contributions

  • Desdaemon: Support not only simple enums but also enums with fields which gets translated to native enum or sealed freezed class in Dart. Support the Option type as nullable types in Dart. Support Vec of Strings type. Support tuple type. Support comments in code. Add marker attributes for future usage. Add Linux and Windows support for with-flutter example, and make CI works for that. Avoid parameter collision. Overhaul the documentation and add several chapters to demonstrate configuring a Flutter+Rust project in all five platforms. Refactor command module. Precompiled binary CI workflow. Fix bugs. Add support for the Web platform, parallel to the existing mobile/desktop platforms, via WASM and JavaScript as intermediate values. GitHub retry actions. Implement draft of opaque types. Refactor Boxed and Option. Impl list of dates and optionals. Parameter defaults. Refactor CLI. Refactor codegen errors. Refactor for performance.
  • rogurotus: Add Rust opaque types, enabling arbitrary Rust structs to be used as opaque Dart objects by generating wrappers and raw Arc pointers. Also add Dart opaque types, allowing to use any Dart objects in Rust code. Extend SyncReturn for more types. Fix generation bug. Fix SyncReturn. Migrate to dart-sys. Update CI. Fix linters. Fix SyncReturn bug.
  • ngasull: Make sync mode support whatever types that classical async mode supports. Bump sdk.
  • SecondFlight: Allow structs and enums to be imported from other files within the crate by creating source graph. Auto-create relevant dir. Fix store_dart_post_cobject error with ffigen 6.0.
  • lattice0: Implement hierarchy of exceptions. Support methods, such that Rust struct impls can be converted to Dart class methods. StreamSink at any argument.
  • Unoqwy: Add struct mirrors, such that types in the external crates can be imported and used without redefining and copying.
  • antonok-edm: Avoid converting syn types to strings before parsing to improve code and be more robust.
  • sagudev: Make code generator a lib. Add error types. Depend on cbindgen. Fix LLVM paths. Update deps. Fix CI errors.
  • surban: Support unit return type. Skip unresolvable modules. Ignore prefer_const_constructors. Non-final Dart fields.
  • Roms1383: Fix build_runner calling bug. Remove global ffigen dependency. Improve version check. Fix enum name-variant conflicts. Support Chrono date time and UUID types. Migrate to Rust 1.64 workspace. Update and refactor CI. Update header comments. Code cleanup.
  • 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 使用后释放的 bug。
  • Cupnfish: 支持数组作为函数参数。允许多镜像。
  • alanlzhang: 添加 Dart 元数据生成。增强并修复模块解析器。修复结构体中的枚举。修复 linter。改进提示。
  • erikas-taroza: 支持原始枚举的列表。枚举使用 camelCase。警告错误路径。修复 cargo expand。
  • SiongSng: 完成异常层次结构的实现。修复 SyncReturn bug。
  • JustSimplyKyle: 也完成异常层次结构的实现。允许忽略函数。
  • Zaitam: 修复当方法返回结构体时的情况。部分迁移到 Dart 3。
  • coder0xff: 讨论未修改的 Rust 绑定。重构 SupportedInnerType。额外的代码生成测试器。
  • NobodyForNothing: 部分支持 impl-for。
  • nitn3lav: 不使用 Box 的嵌套 struct
  • mcmah309: 添加 CLI 插件脚手架生成。
  • AlanKevin: 添加 macOS 的 Flutter 示例。添加 Android NDK bug 文档。改进迁移文档。
  • alexthe2: 添加日期时间选项。添加空结构体。改进文档。添加 #。修复镜像枚举的 bug。
  • Larpoux: 修复异步生成。更新 web-audio-api 绑定。
  • banool: 修复 pubspec 解析。修复符号剥离文档。
  • anlumo: 修复 freezed + 方法。非克隆 RustOpaque。
  • temeddix: 修复 CI 故障。自定义工作进程数。修复 MacOS 文档步骤。更新文档。使零拷贝默认。
  • NightFeather0615: 修复 Vec bool。
  • OfficialBoyfriend: 修复错误显示。
  • wxitcode: 添加 org 选项。支持 MacOS 日志。修复一个打字错误。
  • Tienisto: 添加模拟初始化。
  • 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 + 镜像。修复 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:修复了一个错别字。

依赖项

~0.8–5.5MB
~100K SLoC