Flutter端Firebase Firestore读写操作的协议与实现流程技术咨询
Cloud Firestore Flutter Android应用读写机制说明
底层通信核心规则
- 连接类型:使用持久化TCP长连接,应用启动首次触发Firestore操作时完成握手建立,后续复用连接减少开销,无操作超时后自动回收,下次请求重建
- 传输协议:基于HTTP/2协议封装,支持多路复用,单次连接可并行处理多个读写请求,相比HTTP/1.1大幅降低请求延迟
- 数据传输规则:传输内容为类JSON序列化的Protocol Buffers编码格式,相比纯JSON体积更小、解析速度更快,客户端SDK自动完成Dart对象与序列化格式的转换,应用层无需手动处理编码逻辑
- 请求发送逻辑:所有读写请求先经过本地缓存层,写入操作默认先写本地缓存再同步服务端,读取操作优先返回本地缓存数据再同步服务端最新状态,离线时操作暂存本地,网络恢复后自动续传
写入操作实现逻辑
对应代码如下:
Future addMember(Member mem) { return FirebaseFirestore.instance .collection(Collection.church) .doc(Document.members) .collection(Collection.churchmembers) .doc(mem.uid) .set(mem.toJson()); }
运行逻辑拆解:
- 首先调用
FirebaseFirestore.instance获取全局单例的Firestore客户端实例,实例初始化时会自动加载Firebase配置参数、复用已建立的TCP长连接 - 链式调用逐级定位到目标文档路径:
church集合 →members文档 →churchmembers子集合 → 以传入Member对象的uid为文档ID的目标文档 - 调用
set()方法触发写入逻辑:- 第一步:将传入的
mem.toJson()转换为Firestore支持的键值对格式,写入本地持久化缓存,同时返回Future对象给调用方 - 第二步:SDK将写入数据序列化为Protocol Buffers格式,通过已建立的HTTP/2 over TCP连接发送到Firestore服务端
- 第三步:服务端完成权限校验、数据写入后返回响应,SDK更新本地缓存的写入状态,同时将Future标记为完成;如果写入过程中出现权限不足、网络错误等异常,Future会抛出对应异常
- 第一步:将传入的
- 默认开启延迟持久化,即使网络离线也会先返回操作成功,后续网络恢复时自动同步到服务端,可通过配置关闭该特性实现强一致性写入
监听式读取操作实现逻辑
对应代码如下:
Stream<QuerySnapshot> getServices() { return FirebaseFirestore.instance .collection(Collection.church) .doc(Document.services) .collection(Collection.churchservices) .snapshots(); }
运行逻辑拆解:
- 同样先获取Firestore全局单例实例,逐级定位到
churchservices子集合 - 调用
snapshots()方法返回一个广播Stream,触发监听逻辑:- 第一步:立即读取本地缓存中该集合的所有数据,封装为
QuerySnapshot通过Stream下发给观察者 - 第二步:SDK通过HTTP/2连接向服务端发送该集合的监听注册请求,服务端注册该集合的变更回调
- 第三步:后续只要该集合下的文档发生新增、修改、删除操作,服务端会主动通过已建立的长连接将增量变更推送给客户端
- 第四步:客户端收到增量变更后更新本地缓存,将全量最新的集合数据封装为
QuerySnapshot再次通过Stream下发,直到观察者取消监听
- 第一步:立即读取本地缓存中该集合的所有数据,封装为
- 该监听为长连接推送模式,无需客户端轮询,相比常规HTTP请求功耗更低、实时性更高,网络断开时自动尝试重连并同步断连期间的变更
参考资料指引
相关技术细节可查阅Firebase官方开发者文档中Cloud Firestore底层通信机制、Flutter SDK实现、读写操作逻辑相关章节。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

