升级 Rinf¶
小版本升级¶
每当升级 Rinf 时,请确保 pubspec.yaml 和 native/hub/Cargo.toml 中的 Rinf 版本完全相同。
从 6 迁移到 7¶
整体用法保持不变,但 API 进行了一些更改,以提高代码可读性和灵活性。
显式地将 Rust 中的 main 函数与你选择的异步运行时绑定。同时,别忘了在 main 函数中等待 Rinf 提供的 dart_shutdown future。
[tokio::main]
async fn main() {
// 在这里执行任何你想做的操作。
// ...
rinf::dart_shutdown().await;
}
从 Protobuf 消息注解中移除 RINF:。例如,[RINF:DART-SIGNAL] 应变为 [DART-SIGNAL]。
// [DART-SIGNAL]
message SomeMessage {}
从根 generated 模块导入消息,而非从声明它们的内层模块导入。
import 'generated.dart';
use crate::messages::{MyMessage, AnotherMessage};
当你需要运行 Flutter Web 服务器时,使用 rinf server 获取带有必要参数的完整 Flutter 命令。
rinf server
从 7 迁移到 8¶
信号消息的使用方式保持不变,但其声明方式变得更加简洁。现在,我们定义 Rust 结构体并使用信号 trait 属性对它们进行标注。不再使用 Protobuf。
首先,Rinf 现在需要 Rust 1.85 及 2024 edition。运行以下命令进行更新:
rustup update
rustc --version
将旧的 Rinf CLI 工具替换为新工具:
cargo uninstall rinf
cargo install rinf_cli
修改依赖项:
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
[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 内的任何位置都是可以的:
// [DART-SIGNAL]
message MessageA {}
// [RUST-SIGNAL]
message MessageB {}
message MessageC {}
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/messages 和 native/hub/src/messages 目录:
rinf gen
在 Dart 中从 bindings 模块导入生成的类:
- import 'package:my_app/messages/all.dart';
+ import 'package:my_app/src/bindings/bindings.dart';
信号结构体的方法相同,但它们现在已成为 trait 方法。你应显式导入这些 trait 以确保方法仍然有效:
+ use rinf::{DartSignal, RustSignal};
SomeMessage {}.send_signal_to_dart();
let receiver = SomeMessage::get_dart_signal_receiver();
最后,验证 pubspec.yaml 中的 Rinf 配置(如果有)是否符合新格式。
rinf config
也不要忘记更新 .gitignore 和 README.md 文件!