[官文翻译]绑定Flutter和Rust高级的内存安全代码生成器 flutter_rust_bridge - 简介

1,050 阅读4分钟

本文正在参加「金石计划 . 瓜分6万现金大奖」


官网:Introduction - flutter_rust_bridge (cjycode.com)

pub: flutter_rust_bridge | Dart Package (flutter-io.cn)

译时版本:1.49.1

原文链接:


绑定Flutter和Rust高级的内存安全代码生成器 flutter_rust_bridge

简介

image.png

想要绑定 Flutter(跨平台热加载快速开发的 UI 工具包)和 Rust(可以使每个人都能编译可靠高效软件的语言)? 就是该包了!

[🚀 优势]

  • 内存安全: 从不需要考虑 malloc/free (分配/释放内存)。
  • 特性丰富: 用值枚举 enum、平台优化的 Vec 、可递归的 struct 、零拷贝的大数组、 Stream (迭代) 抽象、错误 (Result) 处理、可取消的任务、并发控制等。在这里查看完整特性.
  • 异步编程: Rust 代码决不会阻塞Flutter。可以从Flutter的主Isolate(线程)很自然地调用Rust。
  • 轻量: 这不是包罗所有的巨大框架,所以可自由使用个人喜欢的Flutter和Dart的库。例如,使用Flutter的库(例,MobX)进行状态管理会更优雅和简洁(相对于Rust中的实现);用Rust实现一个照片处理算法会更快速和安全(相对于Flutter中的实现)。
  • 跨平台: Android、 iOS、 Windows、 Linux、 MacOS、 和 Web 。
  • 易于代码审查&自我确认: 该包简单地模拟了人类如何编写模板代码。如果想要进行自我确认(或项目组内的确认),它是安全的,没有很多代码需要查看。没有任何魔法! (更多关于 安全考量。)
  • 快速: 它只是一个单薄的(即使特性丰富)包装,没有高级特性如 protobuf 序列化,所以性能出众。(以后会有更多 性能指标 ) (抛弃一些组件如线程池可使其更快)
  • 兼容纯Dart: 尽管包名如此,该包和 Dart 也是100%兼容的。

💡 用户向导

查看 用户向导 里的 代码展示、 指南、 特性 和其它更多内容。

快速开始

正常编写 Rust 的函数和类型:

// 一个正常的Rust函数 ...
pub fn draw_tree(root: TreeNode, mode: DrawMode) -> Result<Vec<u8>> { /* ... */ }

// ... 带有丰富的类型
pub struct TreeNode { pub value: String, pub children: Vec<MyTreeNode> }
pub enum DrawMode { Colorful {palette: String}, Grayscale }

安装代码生成器 flutter_rust_bridge_codegen

cargo install flutter_rust_bridge_codegen
# or with cargo-binstall
cargo binstall flutter_rust_bridge_codegen
# or with scoop (Windows)
scoop bucket add frb https://github.com/Desdaemon/scoop-repo
scoop install flutter_rust_bridge_codegen
# or with Homebrew
brew install desdaemon/repo/flutter_rust_bridge_codegen

然后运行代码生成器。

备注: 需要一些安装步骤。可能需要参考下 指南、 从模板创建新工程 或者 集成到已有工程 了解细节。

flutter_rust_bridge_codegen --rust-input path/to/api.rs \
                            --dart-output path/to/bridge_generated.dart

绑定代码自动生成后,就可以无缝衔接在Flutter/Dart中使用:

api.drawTree(TreeNode(value: "root", ...), Colorful(palette: "viridis"));

指南:一个 Flutter+Rust 应用

该指南中,我们会绘制一个 Mandelbrot集合 (一个著名的用简单数学公式生成的无限再生图像)。该图像在 Flutter UI 中绘制、使用Rust算法生成、并通过此包通信。

(看一下什么是 Mandelbrot 集合)

Mandelbrot_sequence_new.gif

Mandelbrot 集合是复数 c 的函数 f_c(z)=z^{2}+c 的集合,当从 z=0 迭代时,它不会发散到无穷大。

Mandelbrot 集合图展示了一个复杂并且无限混乱的边界,并随着放大倍数的增加显示出越来越精细的递归细节。

图像来源(维基百科): Simpsons contributor

获取代码

安装 Flutter (如果不是在移动电话上而是在桌面上运行应用,需开启桌面支持选项),安装 Rust,并熟悉一下它们。然后获取示例代码库:

git clone https://github.com/fzyzcjy/flutter_rust_bridge && cd flutter_rust_bridge/frb_example/with_flutter

可选:运行生成器

该步骤是可选的,因为已经生成了源代码(在 快速开始 中)。即使再做的话,也不会看到任何改变。

一旦对 api.rs 有任何改动,都需要再运行一次代码生成器。 关于代码生成的必要条件,可在 安装依赖 部分查看更多信息。

运行应用

要求:命令详细

如果需要查看每个命令的详细内容, CI workflow 会有帮助。

flutter_android_test、 flutter_ios_test、 flutter_windows_test、 flutter_macos_test 和 flutter_linux_test 演示了在一个新机器上运行该指南代码库的准确命令。

Android应用

添加 ANDROID_NDK=(path to NDK) 到 android/gradle.properties 中,并运行 cargo ndk -o ../android/app/src/main/jniLibs build。然后正常运行 Flutter 应用,如用 flutter run

备注: 该指南 会在编译 Flutter 应用时自动执行 cargo 编译。

iOS 应用

修改 Cargo.toml 将 cdylib 改为 staticlib , 然后运行 cargo lipo && cp target/universal/debug/libflutter_rust_bridge_example.a ../ios/Runner 编译 Rust 并复制静态库。然后正常运行 Flutter 应用,如用 flutter run

备注该指南  会在编译 Flutter 应用时自动执行 cargo 编译。

Windows 应用

直接运行 flutter run ,前提是 支持 Flutter desktop已配置。更多内容可查看 #66

Linux 应用

和 Windows 一样。如果用 snap 安装的 Flutter , 请注意一下 #53

MacOS 应用

和 Windows 一样。 (备注: 在后台, cargo-xcode 用于自动化过程)

Web (作为网页)

安装 flutter_rust_bridge_serve 简化编译和启动 WASM 二进制服务的过程。更多内容查看 Web 安装 。


本文正在参加「金石计划 . 瓜分6万现金大奖」