Post

FlutterRustBridge异步调用与监听回调

一、准备工作

flutter调用通过flutter_rust_bridge调用 1、在rust的Cargo.toml配置

1
2
[build-dependencies]
flutter_rust_bridge_codegen = "2.9.0"

2、flutter的pubspec.ymal配置

1
2
dependencies
    flutter_rust_bridge: 2.9.0

3、配置cli命令

1
cargo install flutter_rust_bridge_codegen --version 2.9.0

二、当其他都配置好后

1、运行命令会自动生成对应代码

1
2
3
4
5
6
flutter_rust_bridge_codegen  generate

# 会自动在flutter项目里生成
# frb_generated.dart
# 会自动在rust项目里生成
# frb_generated.rs

rust项目里写的异步方法:

1
2
3
4
5
6
pub async fn login_by_password(
    account: String
    password: String,
) -> Result<LoginResponse> {
    Ok(LoginResponse{xxxxx})
}

frb_generated.dart 会在每次调用都生成唯一的端口号,端口号对应一个回调,rust处理完后,会执行这个回调,跟网络请求类似

一般方法调用,使用ReceivePort的方式

1
2
3
4
5
6
7
8
          Dart (Flutter)
             ▲       │
             │       ▼
         port       FFI
             │       ▲
             ▼       │
             Rust (native)

| 环节 | 行为 | 技术机制 | | ———– | —— | ——————————— | | Dart → Rust | 发起异步调用 | FFI + Dart Future | | Rust → Dart | 异步回调结果 | Dart Port + Dart_PostCObject_DL | | Dart | 处理返回 | Port 监听器 resolve Future |

长连接的监听使用StreamSink

项目普通 FFI 调用(一次性)StreamSink(持续通信)
通信通道使用 Dart 的 Port(会自动释放)使用 Dart 的 Port(不会主动关闭
生命周期调用完成后关闭 Port需要手动 sink.close() 才关闭
数据模型一次性 Future / 单值返回多次 sink.add(...),对应 Dart 的 Stream
场景调用函数、取结果长连接、事件流、状态更新等
This post is licensed under CC BY 4.0 by the author.