升级 Rinf

小版本升级

每当升级 Rinf 时,请确保 pubspec.yamlnative/hub/Cargo.toml 中的 Rinf 版本完全相同。

从 6 迁移到 7

整体用法保持不变,但 API 进行了一些更改,以提高代码可读性和灵活性。

显式地将 Rust 中的 main 函数与你选择的异步运行时绑定。同时,别忘了在 main 函数中等待 Rinf 提供的 dart_shutdown future。

Rust
[tokio::main]
async fn main() {
  // 在这里执行任何你想做的操作。
  // ...
  rinf::dart_shutdown().await;
}

从 Protobuf 消息注解中移除 RINF:。例如,[RINF:DART-SIGNAL] 应变为 [DART-SIGNAL]

Protobuf
// [DART-SIGNAL]
message SomeMessage {}

从根 generated 模块导入消息,而非从声明它们的内层模块导入。

Dart
import 'generated.dart';
Rust
use crate::messages::{MyMessage, AnotherMessage};

当你需要运行 Flutter Web 服务器时,使用 rinf server 获取带有必要参数的完整 Flutter 命令。

CLI
rinf server

从 7 迁移到 8

信号消息的使用方式保持不变,但其声明方式变得更加简洁。现在,我们定义 Rust 结构体并使用信号 trait 属性对它们进行标注。不再使用 Protobuf。

首先,Rinf 现在需要 Rust 1.85 及 2024 edition。运行以下命令进行更新:

CLI
rustup update
rustc --version

将旧的 Rinf CLI 工具替换为新工具:

CLI
cargo uninstall rinf
cargo install rinf_cli

修改依赖项:

pubspec.yaml
  dependencies:
    # ...
-   rinf: ^7.0.0
-   protobuf: ^3.1.0
-   fixnum: ^1.1.0
+   rinf: ^8.0.0
+   tuple: ^2.0.2
+   meta: ^1.16.0
native/hub/Cargo.toml
  [dependencies]
  # ...
- rinf = "7.0.0"
- prost = "0.12.6"
+ rinf = "8.0.0"
+ serde = "1.0.219"

将所有 Protobuf 消息移入 hub crate。将它们放在 native/hub/src/signals/mod.rs 中是一个不错的起点,但 hub crate 内的任何位置都是可以的:

Protobuf (升级之前)
// [DART-SIGNAL]
message MessageA {}

// [RUST-SIGNAL]
message MessageB {}

message MessageC {}
Rust (升级之后)
use rinf::{DartSignal, RustSignal, SignalPiece};
use serde::{Deserialize, Serialize};

#[derive(Deserialize, DartSignal)]
pub struct MessageA {}

#[derive(Serialize, RustSignal)]
pub struct MessageB {}

#[derive(SignalPiece)] // 根据需要添加 `Serialize` 或 `Deserialize`
pub struct MessageC {}

要生成对应的 Dart 代码,请使用 rinf gen 代替 rinf message。新的 Dart 代码在 lib/src/bindings 中生成后,你可能需要手动移除 lib/messagesnative/hub/src/messages 目录:

CLI
rinf gen

在 Dart 中从 bindings 模块导入生成的类:

Dart
- import 'package:my_app/messages/all.dart';
+ import 'package:my_app/src/bindings/bindings.dart';

信号结构体的方法相同,但它们现在已成为 trait 方法。你应显式导入这些 trait 以确保方法仍然有效:

Rust
+ use rinf::{DartSignal, RustSignal};

  SomeMessage {}.send_signal_to_dart();
  let receiver = SomeMessage::get_dart_signal_receiver();

最后,验证 pubspec.yaml 中的 Rinf 配置(如果有)是否符合新格式。

CLI
rinf config

也不要忘记更新 .gitignoreREADME.md 文件!