Rinf框架,使用Flutter和Rust开发跨平台应用
更新日期:
rinf, Rust in Flutter, 即使用flutter结合Rust来开发跨平台桌面应用的框架,支持linux/android/windows/macOS/iOS/Web。Flutter是较为成熟的跨平台UI框架, 利用Rust来保证性能与内存安全。rinf文档中的建议是只使用flutter来实现界面展示,而业务逻辑使用Rust来开发。Flutter与Rust之间的消息通信使用Protobuf格式,rinf工具根据定义好的请求、响应数据结构的Protobuf schema生成相应的代码,并且实现了消息signal的转发。
在网上搜索资料的过程中,发现还有另一个框架flutter_rust_bridge,同样是使用flutter+rust技术,实现原理上有所不同。 等有空闲再研究下flutter_rust_bridge。Github上flutter_rust_bridge(3.4k)项目标星数量要比rinf(1.3k)的多。
参考:
- rinf https://github.com/cunarist/rinf
- flutter_rust_bridge https://github.com/fzyzcjy/flutter_rust_bridge
安装软件,搭建项目框架
使用rinf开发框架需要安装Flutter SDK与Rust工具。安装完成后,可以使用如下工具来检查它们的版本信息。
1 | rustc --version |
然后安装rinf框架,新建工程
1 | # 为flutter项目添加框架 |
项目生成完之后,就可以尝试运行项目。
1 | # run |
生成的内容如下,图片来自rinf文档。标绿色背景的是rust项目代码,其中messages下为protobuf定义文件, native/hub
为rust消息处理逻辑,sample_crate是示例的依赖crate,是可以不需要的,或者换成其它需要的依赖包,然后在hub中声明依赖就可以了。
参考:
- rinf 文档 https://rinf.cunarist.com/applying-template/
- Flutter SDK https://docs.flutter.dev/get-started/install
- Rust toolchain https://www.rust-lang.org/tools/install
定义消息protobuf
rinf中的消息通知是单向的,需要分别定义从Dart到Rust、Rust到Dart的消息格式,即分别定义请求与响应的消息格式,而不是RPC调用方式。protobuf格式中需要添加特别的注释来生成消息通道channel的代码,如果添加时只会生成正常的结构体与序列化代码。
定义Protobuf消息文件后,使用rinf message
来生成代码。
1 | rinf message |
- 注释
// [RINF:DART-SIGNAL]
生成到Dart到Rust消息通道, 在Dart中使用方法sendSignalToRust()
发送消息。
1 | == Protobuf == |
- 注释
// [RINF:RUST-SIGNAL]
生成到Rust到Dart消息通道, 在Rust中使用send_signal_to_dart()
发送消息。
1 | == Protobuf == |