文章目录
  1. 1. 安装软件,搭建项目框架
  2. 2. 定义消息protobuf

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开发框架需要安装Flutter SDK与Rust工具。安装完成后,可以使用如下工具来检查它们的版本信息。

1
2
rustc --version
flutter doctor

然后安装rinf框架,新建工程

1
2
3
4
5
6
# 为flutter项目添加框架
flutter pub add rinf
# 使用cargo安装rinf
cargo install rinf
# 使用rinf模板创建项目
rinf template

项目生成完之后,就可以尝试运行项目。

1
2
3
4
# run
flutter run
# build
flutter build [platform] # Replace it with a platform name

生成的内容如下,图片来自rinf文档。标绿色背景的是rust项目代码,其中messages下为protobuf定义文件, native/hub为rust消息处理逻辑,sample_crate是示例的依赖crate,是可以不需要的,或者换成其它需要的依赖包,然后在hub中声明依赖就可以了。

rinf-template-files

参考:

定义消息protobuf

rinf中的消息通知是单向的,需要分别定义从Dart到Rust、Rust到Dart的消息格式,即分别定义请求与响应的消息格式,而不是RPC调用方式。protobuf格式中需要添加特别的注释来生成消息通道channel的代码,如果添加时只会生成正常的结构体与序列化代码。

定义Protobuf消息文件后,使用rinf message来生成代码。

1
rinf message
  • 注释// [RINF:DART-SIGNAL] 生成到Dart到Rust消息通道, 在Dart中使用方法sendSignalToRust()发送消息。
1
2
3
4
5
6
7
8
9
10
11
12
13
== Protobuf ==
// [RINF:DART-SIGNAL]
message MyDataInput { ... }

== Dart ==
MyDataInput( ... ).sendSignalToRust(null);


== Rust ==
let mut receiver = MyDataInput::get_dart_signal_receiver();
while let Some(dart_signal) = receiver.recv().await {
// Custom Rust logic here
}
  • 注释// [RINF:RUST-SIGNAL] 生成到Rust到Dart消息通道, 在Rust中使用send_signal_to_dart()发送消息。
1
2
3
4
5
6
7
8
9
10
11
12
== Protobuf ==
// [RINF:RUST-SIGNAL]
message MyDataOutput { ... }

== Dart ==
fianl stream = MyDataOutput.rustSignalStream;
await for (final rustSignal in stream) {
// Custom Dart logic here
}

== Rust ==
MyDataOutput { ... }.send_signal_to_dart(None);
文章目录
  1. 1. 安装软件,搭建项目框架
  2. 2. 定义消息protobuf