如何使用flutter_rust_bridge_codegen实现Flutter与Rust的桥接

最近在尝试用flutter_rust_bridge_codegen实现Flutter和Rust的交互,但在配置过程中遇到了一些问题。具体来说,不清楚如何正确设置build.rs和ffi相关的配置,也不知道该如何定义Dart和Rust之间的接口协议。有没有比较完整的示例可以参考?另外,生成代码后该如何在Flutter项目中正确引入和使用这些桥接代码?希望能得到详细的配置指导和使用示例。

2 回复
  1. 安装工具:cargo install flutter_rust_bridge_codegen
  2. 创建Rust库项目,在Cargo.toml添加依赖
  3. 编写Rust函数并用#[frb]标记
  4. 运行生成命令:flutter_rust_bridge_codegen ...
  5. Flutter端引入生成的dart文件
  6. 调用Rust函数就像调用普通Dart函数一样

注意:需要配置好FFI和平台特定设置。

更多关于如何使用flutter_rust_bridge_codegen实现Flutter与Rust的桥接的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


使用 flutter_rust_bridge_codegen 实现 Flutter 与 Rust 桥接的步骤如下:

  1. 安装依赖
    pubspec.yaml 中添加:

    dependencies:
      flutter_rust_bridge: ^1.80.1
      ffi: ^2.0.1
    dev_dependencies:
      flutter_rust_bridge_codegen: ^1.80.1
    
  2. 创建 Rust 项目
    在 Flutter 项目根目录下创建 Rust 库:

    cargo init --lib rust_lib
    

    编辑 rust_lib/Cargo.toml,设置为 cdylib

    [lib]
    crate-type = ["cdylib"]
    
  3. 编写 Rust 代码
    rust_lib/src/lib.rs 中定义函数(示例):

    use std::os::raw::c_char;
    use std::ffi::CString;
    
    #[no_mangle]
    pub extern "C" fn greet(name: *const c_char) -> *mut c_char {
        let name = unsafe { CStr::from_ptr(name).to_str().unwrap() };
        CString::new(format!("Hello, {}!", name)).unwrap().into_raw()
    }
    
  4. 生成桥接代码
    创建 bridge_definitions/api.dart 定义接口:

    // 定义 Rust 函数签名
    typedef GreetFunction = Pointer<Utf8> Function(Pointer<Utf8>);
    

    运行代码生成:

    flutter_rust_bridge_codegen \
      --rust-input rust_lib/src/lib.rs \
      --dart-output lib/bridge_generated.dart \
      --dart-decl-output lib/bridge_definitions.dart
    
  5. 编译 Rust 库
    根据目标平台编译(以 Android 为例):

    cd rust_lib && cargo ndk -t arm64-v8a build
    

    将生成的 .so 文件放入 Flutter 的 android/app/src/main/jniLibs/

  6. 在 Flutter 中调用
    在 Dart 中加载并调用:

    import 'bridge_generated.dart';
    
    final dylib = DynamicLibrary.open('librust_lib.so');
    final greet = dylib.lookupFunction<GreetFunction, GreetFunction>('greet');
    
    void main() {
      print(greet('World'.toNativeUtf8()).toDartString());
    }
    

注意事项

  • 确保 Rust 函数使用 #[no_mangle]extern "C"
  • 跨平台时需分别编译 Rust 库(iOS/Android/Windows等)。
  • 使用 ffi 处理数据类型转换时注意内存安全。

通过以上步骤即可实现 Flutter 与 Rust 的高效桥接,兼顾性能与跨平台能力。

回到顶部