164次发布 (稳定)

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.10.0 2021年12月31日

#14#binding-generator

Download history 20865/week @ 2024-04-27 19413/week @ 2024-05-04 17342/week @ 2024-05-11 16899/week @ 2024-05-18 15637/week @ 2024-05-25 16362/week @ 2024-06-01 13271/week @ 2024-06-08 11689/week @ 2024-06-15 12092/week @ 2024-06-22 15538/week @ 2024-06-29 17133/week @ 2024-07-06 17261/week @ 2024-07-13 15256/week @ 2024-07-20 18539/week @ 2024-07-27 20239/week @ 2024-08-03 14308/week @ 2024-08-10

每月70,811次下载
2 个crate中使用 (通过 flutter_rust_bridge)

MIT 协议

70KB
155

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 用于 I/O 密集型任务,线程池用于 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:高度高效和性能优异,可靠,高效。
    • "最受欢迎的编程语言"(由 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 key 遵循 all-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
安东·拉扎列夫

💻
sagu
sa gu

💻 📖
Sebastian Urban
塞巴斯蒂安·乌尔班

💻
Rom's
罗姆的

💻 📖
老董
老董

💻 📖
Gregory Conrad
格雷格·康拉德

📖 💻
huang12zheng
huang12zheng

💻 📖
Daniel
丹尼尔

💻
Manuel Philipp
曼纽尔·菲利普

💻 📖
SoLongAnd...
SoLongAnd...

💻 📖
hsfzxjy
hsfzxjy

💻
Cupnfish
Cupnfish

💻
alanlzhang
alanlzhang

💻 📖
Erikas Taroza
Erikas Taroza

💻
菘菘
菜菜

💻
SimplyKyle!
SimplyKyle!

💻
Zaitam
Zaitam

💻
Brent Lewis
布伦特·刘易斯

💻 📖
derdilla
derdilla

💻 📖
nitn3lav
nitn3lav

💻 📖
Henry
亨利

💻
Kevin Li
李·凯文

💻 📖
Alex Procelewski
Alex Procelewski

📖 💻
Larpoux
Larpoux

💻
Daniel Porteous (dport)
丹尼尔·波蒂厄斯 (dport)

📖
Andreas Monitzer
安德烈亚斯·莫尼策

💻
Kim Dong-Hyun
金东润

💻 📖
NightFeather
NightFeather

💻
九月
九月

💻
wxitcode
wxitcode

📖
Tien Do Nam
丁诺南

💻
Markus
马克斯

💻
Krysl
克里尔

💻
Wouter Ensink
沃特·恩辛克

📖
Marcel
马塞尔

💻
Aidan
艾丹

📖
Debanjan Basu
德班詹·巴苏

📖
Patrick Auernig
帕特里克·奥厄尼格

💻
Sai Chaitanya
萨伊·查伊塔尼亚

💻
Xidorn Quan
谢德龙·泉

💻
jsonmona
jsonmona

💻
mtz
mtz

💻
codercengiz
codercengiz

💻
Aran Donohue
阿兰·多诺休

💻
Michael Bryan
迈克尔·布赖恩

💻
Patrick Mukherjee
帕特里克·穆克吉

💻
Philip Kannegaard Hayes
菲利普·坎内加德·海耶斯

💻
SilverMira
银色之镜

💻
Sander in 't Hout
桑德·因·豪特

💻
Haled Odat
哈立德·奥达特

💻
王宇逸
王宇逸

💻
bus710
bus710

📖
._.
._.

📖
Marc Gutenberger
马克·古滕贝格

💻
Andrii Stadnik
安德烈·斯塔德尼克

💻
syndim
syndim

💻
Dirk Van Haerenborgh
德里克·范·哈伦博格

💻
Rhian Moraes
瑞安·莫拉埃斯

📖
Ares Andrew
安德鲁斯·安德鲁

📖
polypixeldev
polypixeldev

📖
CicadaCinema
CicadaCinema

💻 📖
CosmicHorror
CosmicHorror

💻
Akash Gurava
阿卡什·古拉瓦

💻
Fabian Löschner
法比安·洛申纳

💻
Vincent Herlemont
文森特·赫尔蒙

💻
canxin
canxin

💻
pixelshot91
pixelshot91

📖
TrackerSB
TrackerSB

💻
Dampfwalze
Dampfwalze

📖
Samuel Cavalcanti
塞缪尔·卡瓦坎蒂

📖
Roman Zaynetdinov
罗曼·扎伊内丁诺夫

📖
raphaelrobert
raphaelrobert

📖
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
安东尼奥·德苏萨

📖
max
max

📖
Jonathan
Jonathan

📖
Akash Jaiswal
Akash Jaiswal

📖
Febrian Setianto
Febrian Setianto

📖
Satvik Pendem
Satvik Pendem

💻
Damien Wise
达米恩·韦斯

📖
rustui
rustui

📖
J
J

📖
Ikko Ashimine
Ikko Ashimine

📖
thesimplekid
thesimplekid

📖

更具体地说,感谢所有的这些贡献

  • 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