news 2026/8/10 3:10:31

BLoC vs Riverpod:命令式系统 与 声明式系统的两条架构路线

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BLoC vs Riverpod:命令式系统 与 声明式系统的两条架构路线

很多人把 BLoC 和 Riverpod 当成“两个 Flutter 状态管理框架”来选。
但当项目复杂到一定程度,你会发现:

👉 这根本不是“库选型问题”,而是系统建模路线选择问题

更准确地说:
BLoC 和 Riverpod,代表了两种非常典型的系统设计思想:
命令式系统 vs 声明式系统。

一、先跳出 Flutter:什么是“命令式 vs 声明式”

在软件工程中,一个非常经典的区分是:

  • 命令式(Imperative):我告诉系统“发生了什么、要做什么”

  • 声明式(Declarative):我告诉系统“关系是什么、结果应当是什么”

🌱 命令式系统关心的是:

  • 发生了什么?
  • 系统该执行什么动作?
  • 状态如何一步步演进?

🌱 声明式系统关心的是:

  • 谁由谁决定?
  • 这个结果依赖哪些输入?
  • 当输入变化,结果自然该变化

UI 世界里我们熟悉的是:

  • 命令式 UI:手动操作 View
  • 声明式 UI:描述 UI 结构

但在状态管理和架构层面,同样存在这两条路线。

二、Riverpod:典型的“声明式系统”

Riverpod 的核心不是“事件”,而是:

👉依赖关系

final totalPriceProvider = Provider((ref) { final items = ref.watch(cartProvider); final coupon = ref.watch(couponProvider); return calc(items, coupon); });

你在这里没有说“什么时候更新 totalPrice”,
你只是声明了一个关系

totalPrice = f(items, coupon)

剩下的事情全部交给系统:

  • items 变 → totalPrice 自动变
  • coupon 变 → totalPrice 自动变
  • 没人用 → 可以回收
  • 上游替换 → 下游自动重建

👉 这是一个声明式依赖系统

你描述的是:

“这个东西由这些东西决定。”

而不是:

“当这个变了你要去改那个。”

Riverpod 的系统风格

  • 变化来自:上游节点变化

  • 系统核心:依赖图

  • 程序员角色:声明关系

  • 系统角色:负责传播

非常像:

  • Excel 公式系统

  • React / Compose 状态派生

  • DI 容器 + 响应式引擎

👉 这是声明式路线

三、BLoC:典型的“命令式系统”

BLoC 的核心不是“谁依赖谁”,而是:

👉发生了什么

bloc.add(SubmitOrder()); bloc.add(Refresh()); bloc.add(DeviceDisconnected());

系统的所有变化,都必须通过:

👉事件(Event)

Bloc 做的事情是:

(当前状态, 收到事件) -> 新状态

你必须显式写清楚:

  • 有哪些事件
  • 有哪些状态
  • 每个状态下收到某事件会发生什么

👉 这是一个事件驱动状态机

你描述的是:

“系统经历了什么,它因此走到了哪一步。”

而不是:

“这个值由谁算出来。”

BLoC 的系统风格

  • 变化来自:显式事件
  • 系统核心:状态机
  • 程序员角色:设计流程
  • 系统角色:执行迁移

非常像:

  • Redux / MVI
  • 协议状态机
  • 工作流引擎
  • 后端事件驱动系统

👉 这是命令式路线

四、把差别说透:不是“写法”,是“控制权”

真正的差别在于:

👉系统变化由谁主导。

Riverpod:

数据变了 → 系统自动推导后果

你交给系统的是“关系”,
系统掌控的是“变化传播”。

BLoC:

发生了什么 → 系统执行对应行为

你交给系统的是“事件”,
你自己掌控的是“演进规则”。

这正是命令式 vs 声明式在系统层面的体现。

五、选型不是二选一,而是“你在解决什么问题”

更偏 Riverpod 的场景

  • 派生状态多
  • 数据联动强
  • 依赖复杂
  • 生命周期复杂
  • 资源型系统(repo / cache / service)

👉 本质是结构问题


更偏 BLoC 的场景

  • 状态阶段多
  • 流程复杂
  • 异常分支多
  • 行为必须可推理
  • 协议 / 设备 / 业务流

👉 本质是行为问题

六、成熟架构里最常见的组合

现实项目里,最常见、最稳的结构往往是:

Riverpod —— 管系统结构 / 资源 / 依赖 BLoC —— 管业务流程 / 页面行为 / 状态机

也就是:

👉 Riverpod 解决“系统怎么连起来”
👉 BLoC 解决“系统怎么走下去”

七、把这条认知线拉回你最初的直觉

你说:

它们有点像命令式 UI 和声明式 UI

这个直觉是完全正确的,只是层级更高:

👉 不是 UI 写法层
👉 是系统建模层

你感受到的,其实是:

👉控制权从“人”交给“系统” vs 从“系统”交回“人”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/9 4:53:17

内网渗透:一次完整的域渗透-网络安全(黑客)自学

在开始域渗透之前,先来简单了解下域的一些概念 域(Domain)是一个有安全边界的计算机集合(安全边界的意思是,在两个域中,一个域中的用户无法访问另一个域中的资源) 工作组的分散管理模式不适合大…

作者头像 李华
网站建设 2026/7/31 5:44:58

JavaScript Date 语法要过时了!以后用这个替代!

1. 前言作为一名前端开发工程师,你一定被 JavaScript 的日期处理折磨过。这不是你的问题,是 JavaScript 自己的问题——它的 Date 功能真的很糟糕。2. Date 的离谱行为让我给你举几个例子,你就明白有多离谱了:月份从 0 开始计数&a…

作者头像 李华
网站建设 2026/7/31 3:16:29

Vue Vben Admin 登录页修改全攻略:从登录界面定制到接口对接全流程配置

Vue Vben Admin 登录页修改全攻略:从登录界面定制到接口对接全流程配置 前言 Vue Vben Admin 是一个功能强大的 Vue3 + TypeScript 后台管理系统模板,但对于很多开发者来说,如何改造登录页并将其对接到自己的后端系统是一个常见的需求。本文将结合实际仓库代码,详细介绍如…

作者头像 李华
网站建设 2026/7/31 2:51:31

【心率检测】 心电信号(ECG)处理从原始 ECG 数据中提取 R 波峰值、计算心率(HR)与心率变异性(HRV)Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &#x1…

作者头像 李华
网站建设 2026/8/9 19:33:01

宏智树 AI:降重去 AIGC 的 “学术合规密码”,论文优化避坑科普

作为专注论文写作科普的博主,后台高频求助集中在两个核心痛点:“查重率反复超标,越改逻辑越乱”“AI 辅助写作后,机器痕迹被导师一眼看穿”。在知网、维普等查重系统算法升级,AIGC 检测工具普及的当下,简单…

作者头像 李华
网站建设 2026/8/2 10:41:18

【收藏必备】LangGraph从入门到精通(一):概念全解析,构建有状态智能体的必学框架

文章全面介绍LangGraph这一基于图计算的有状态Agent框架,从基础架构、环境配置、持久化机制、Human-in-the-loop功能到长期记忆应用、工具集成、子图设计和多智能体系统构建进行系统讲解。通过深入解析核心概念与实战应用,帮助开发者掌握LangGraph的关键…

作者头像 李华