首页
/ Flutter Rust Bridge 中的外部类型与自定义序列化方案

Flutter Rust Bridge 中的外部类型与自定义序列化方案

2025-06-13 03:16:31作者:郁楠烈Hubert

在 Flutter 与 Rust 混合开发中,Flutter Rust Bridge (FRB) 作为连接两端的桥梁发挥着重要作用。然而,当项目中同时存在多种代码生成器时,类型兼容性问题便浮出水面。本文将深入探讨这一问题的本质及其解决方案。

问题背景

当项目中同时使用多种代码生成工具时,例如在 Rust 端使用 prost_build 生成 protobuf 类型,在 Dart 端使用 protoc_builder 生成对应的 Dart 类型,FRB 也会生成自己的类型版本。这就导致了同一数据类型在不同生成器下产生多个不兼容的实现版本。

例如,一个名为 AwesomeMessage 的 protobuf 消息类型:

  • Rust 端:通过 prost_build 生成 awesome_proto_crate::AwesomeMessage
  • Dart 端:通过 protoc_builder 生成 package:awesome_proto 中的 AwesomeMessage
  • FRB 生成:package:awesome/src/rust/api/api.dart 中的 AwesomeMessage

这三个版本的 AwesomeMessage 虽然表示相同的数据结构,但由于来自不同的生成器,彼此间无法直接兼容使用。

解决方案设计

FRB 提供了优雅的解决方案,允许开发者指定使用现有的外部类型,而非生成新版本。核心思路是通过注解声明类型映射关系,并配置相应的序列化/反序列化逻辑。

基本用法

在 Rust 代码中,可以通过如下方式声明外部类型映射:

#[frb(some_marker_name_to_be_determined(
    dart = "AwesomeMessage", 
    package = "awesome_proto", 
    decode = "AwesomeMessage.from_bytes(raw)"
))]
fn encode_awesome_message(obj: AwesomeMessage) -> anyhow::Result<Vec<u8>> {
    obj.serialize_protobuf_into_bytes()
}

这个方案包含几个关键部分:

  1. 类型映射:指定 Rust 类型对应到哪个 Dart 类型及所在包
  2. 序列化:定义如何将 Rust 类型转换为中间格式(如字节数组)
  3. 反序列化:提供 Dart 端从中间格式重建对象的逻辑

错误处理

考虑到序列化过程可能失败,方案原生支持 anyhow::Result 作为返回类型,与 FRB 现有的错误处理机制无缝集成。

实现细节

在实际实现中,FRB 会维护一个类型转换表,记录:

  • Rust 序列化器:将 Rust 类型转换为中间格式
  • Dart 反序列化器:将中间格式转换为 Dart 对象
  • 反向路径:Dart 到 Rust 的转换逻辑

这种设计使得类型转换过程对开发者透明,只需在边界处声明一次映射关系即可。

使用场景扩展

这种机制不仅适用于 protobuf 类型,还可应用于任何需要与现有 Dart 类型集成的场景:

  1. 数据库模型类型
  2. 第三方库定义的数据结构
  3. 项目中已有稳定接口的类型

注意事项

当前实现主要针对 SSE (Synchronous Stream Encoding) 编解码器。在使用时需要注意:

  1. 避免同时启用 full_dep 选项,这可能导致编译错误
  2. 对于复杂嵌套类型(如包含自定义序列化类型的结构体成员),需要确保整体类型系统一致性
  3. 性能考量:某些序列化方案(如 protobuf)可能不如原生序列化高效

总结

Flutter Rust Bridge 的外部类型支持机制为解决多代码生成器环境下的类型兼容性问题提供了优雅方案。通过声明式配置和灵活的序列化扩展点,开发者可以轻松集成现有类型系统,避免重复定义和转换开销。这一特性特别适合已有成熟代码库需要逐步接入 Flutter-Rust 混合架构的场景。

登录后查看全文
热门项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
22
6
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
165
2.05 K
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
8
0
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
954
563
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
60
16
apintoapinto
基于golang开发的网关。具有各种插件,可以自行扩展,即插即用。此外,它可以快速帮助企业管理API服务,提高API服务的稳定性和安全性。
Go
22
0
giteagitea
喝着茶写代码!最易用的自托管一站式代码托管平台,包含Git托管,代码审查,团队协作,软件包和CI/CD。
Go
17
0
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
408
387
金融AI编程实战金融AI编程实战
为非计算机科班出身 (例如财经类高校金融学院) 同学量身定制,新手友好,让学生以亲身实践开源开发的方式,学会使用计算机自动化自己的科研/创新工作。案例以量化投资为主线,涉及 Bash、Python、SQL、BI、AI 等全技术栈,培养面向未来的数智化人才 (如数据工程师、数据分析师、数据科学家、数据决策者、量化投资人)。
Python
77
71
rainbondrainbond
无需学习 Kubernetes 的容器平台,在 Kubernetes 上构建、部署、组装和管理应用,无需 K8s 专业知识,全流程图形化管理
Go
14
1