用 Signals 与 mapSignal 破解 Riverpod 的 Family Provider 缓存难题
来源:dev.to — 2026-08-03
📋 概述
当 Flutter 项目用多个带参数的 family provider 分别缓存不同的网络查询时,每个 provider 都成了“孤立状态筒仓”:同一实体在多个子集里各有副本,更新其中一个会导致其他子集出现脏数据。文章给出信号架构解法:把所有实体集中到规范化的 mapSignal 实体库(单一事实来源),用 computed 信号做派生投影过滤视图。更新一个 key 自动触发所有相关视图刷新,且不产生多余网络请求。
🔑 核心要点
- 根因是孤立筒仓:参数化 provider 兼当本地状态容器,同一实体在不同子集里重复、互不知晓
- 规范化单一来源:实体统一存进 mapSignal,过滤视图变成纯客户端 computed 派生
- 键级细粒度响应:mapSignal 修改单个 key 只通知相关订阅者,不像普通 signal 需要克隆整个 Map
- 关系同步用外键:Task 存 lastEditorId 而非内嵌快照,用户改名自动同步到所有相关 UI
- 零手动失效:tasks['id']=更新 后 column1Tasks/column2Tasks 自动重算,无需 invalidate 全量重取
💡 金句
State management transforms from a web of manual invalidations into an automated, self-updating reactive pipeline.
👍 0
👎 0
← 返回 Dev.to 首页