状态管理:Flutter 为什么走上了和前端一样的“百家争鸣”?

网罗开发(小红书、快手、视频号同名)

大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • 前言
    • 状态为什么会“爆炸”?不是 Flutter 的锅
      • 状态从什么时候开始失控?
    • Flutter 和前端,状态模型几乎是同构的
      • 对比一下两边的状态形态
        • 前端 / RN
        • Flutter
    • 一个 Flutter 中最典型的“状态开始失控”的例子
      • 初期写法:状态直接写在页面里
    • Provider / Riverpod / Bloc,其实是在解决同一件事
      • 一个最基础的 Provider Demo
      • 这和 Redux / Zustand 有什么区别?
    • RN 项目为什么会掉进 Redux 地狱?
    • iOS 状态为什么看起来更“稳定”?
      • iOS 的“稳定”,来自强约束
      • 但代价是什么?
    • 真正通用的,是“状态分层”,而不是具体框架
      • 一个跨技术栈通用的状态分层模型
        • 本地 UI 状态
        • 页面业务状态
        • 全局状态
    • 用 Flutter 再写一版“分层正确”的 Demo
    • 总结

前言

如果你写 Flutter 写到一定阶段,迟早会遇到一个问题:

项目一开始很简单,用setState就够了
过一阵子开始加 Provider
再后来又有人提 Riverpod / Bloc
最后大家都在问:我们到底该用哪个?

如果你有前端或者 RN 经验,这一幕其实一点都不陌生。

Redux、MobX、Zustand、Recoil……
前端早就经历过一次完整的“状态管理百家争鸣”。

那问题来了:

为什么 Flutter 这么快就走上了和前端一模一样的路?

状态为什么会“爆炸”?不是 Flutter 的锅

先说一个很多人不太愿意承认的事实:

状态复杂化,几乎是所有中大型应用的必经之路。

状态从什么时候开始失控?

你回忆一下项目的演进路径,通常是这样的:

  • 一开始:
    页面里几个变量,setState很香
  • 业务变复杂:
    表单、列表、筛选条件、分页状态开始增多
  • 再后来:
    登录态、用户信息、权限、配置、缓存
  • 最后:
    多页面共享状态 + 异步 + 回退恢复

这时候你会发现一个很现实的问题:

状态已经不再属于“某一个 Widget / 页面”了。

而一旦状态开始跨页面、跨模块存在,单纯的 setState 就一定会崩

Flutter 和前端,状态模型几乎是同构的

这也是为什么 Flutter 会自然长出一堆状态管理方案。

因为Flutter 和 React 本质上解决的是同一个问题

UI = f(State)

状态一变,就要重新描述 UI。

对比一下两边的状态形态

前端 / RN
  • 组件本地状态
  • 页面级状态
  • 全局状态(用户、配置、权限)
Flutter
  • Widget 内部 State
  • 页面级 State(ViewModel / Controller)
  • 全局 State(Provider / Riverpod)

你会发现,层级是一模一样的,只是名字不同。

一个 Flutter 中最典型的“状态开始失控”的例子

先看一个非常常见的写法。

初期写法:状态直接写在页面里

classUserPageextendsStatefulWidget{@overrideState<UserPage>createState()=>_UserPageState();}class_UserPageStateextendsState<UserPage>{bool loading=false;StringuserName='';Future<void>loadUser()async{setState((){loading=true;});awaitFuture.delayed(Duration(seconds:1));setState((){userName='Tom';loading=false;});}@overridevoidinitState(){super.initState();loadUser();}@overrideWidgetbuild(BuildContextcontext){returnloading?CircularProgressIndicator():Text('Hello$userName');}}

一开始看起来没毛病。

但问题很快就会出现:

  • 用户信息被多个页面用
  • 页面返回时状态要保留
  • 刷新、错误、空态开始增多

你会发现:

页面既负责 UI,又负责业务状态,又负责异步流程。

这一步,就是 Flutter 和前端一起迈进“状态复杂区”的开始。

Provider / Riverpod / Bloc,其实是在解决同一件事

很多 Flutter 新手会纠结:

Provider 和 Riverpod 到底差在哪?
Bloc 是不是太重了?

但从设计目标来看,它们高度一致:

把状态从 Widget 中“拎出来”

一个最基础的 Provider Demo

classCounterModelextendsChangeNotifier{int count=0;voidincrement(){count++;notifyListeners();}}
voidmain(){runApp(ChangeNotifierProvider(create:(_)=>CounterModel(),child:MyApp(),),);}
classCounterViewextendsStatelessWidget{@overrideWidgetbuild(BuildContextcontext){finalcounter=context.watch<CounterModel>();returnColumn(children:[Text('Count:${counter.count}'),ElevatedButton(onPressed:counter.increment,child:Text('Add'),),],);}}

这和 Redux / Zustand 有什么区别?

如果你把语言换一下:

  • ChangeNotifier ≈ Store
  • notifyListeners ≈ dispatch
  • watch ≈ subscribe

逻辑结构几乎完全一致。

Flutter 并不是“模仿前端”,
而是在声明式 UI 体系下,状态管理只有这一条路能走

RN 项目为什么会掉进 Redux 地狱?

这件事对 Flutter 其实是一个非常重要的警示。

Redux 出问题,从来不是因为它“设计不好”,而是因为:

  • 所有状态都被塞进全局 Store
  • 页面级、组件级状态没有边界
  • 一点小交互也要走 action → reducer

结果就是:

状态集中化过度,反而失去可维护性。

Flutter 如果无脑全局 Provider / Riverpod,结局是一模一样的。

iOS 状态为什么看起来更“稳定”?

很多 iOS 开发者会说:

我写 UIKit / MVVM,很少纠结状态管理。

这是因为 iOS 用的是另一套代价体系

iOS 的“稳定”,来自强约束

  • 页面生命周期固定
  • Controller 持有 View
  • 数据流向非常明确

你要更新什么,就直接调方法。

viewModel.userName="Tom"view.update()

不会有“自动重建整棵 UI 树”这件事。

但代价是什么?

  • 状态复用成本高
  • 跨页面共享复杂
  • 多端复用几乎不可能

iOS 的稳定,是用灵活性和扩展性换来的

真正通用的,是“状态分层”,而不是具体框架

如果你横向看 Flutter / 前端 / iOS,会发现一个共识:

状态不是越集中越好,而是各归其位

一个跨技术栈通用的状态分层模型

本地 UI 状态
  • loading
  • checkbox 勾选
  • 动画开关

放在 Widget / Component 内部

页面业务状态
  • 列表数据
  • 表单内容
  • 页面筛选条件

放在 ViewModel / Controller / Notifier

全局状态
  • 登录态
  • 用户信息
  • 配置、权限

少而精,慎重放全局

用 Flutter 再写一版“分层正确”的 Demo

classUserStateextendsChangeNotifier{StringuserName='';bool loading=false;Future<void>loadUser()async{loading=true;notifyListeners();awaitFuture.delayed(Duration(seconds:1));userName='Tom';loading=false;notifyListeners();}}
classUserPageextendsStatelessWidget{@overrideWidgetbuild(BuildContextcontext){finalstate=context.watch<UserState>();if(state.loading){returnCircularProgressIndicator();}returnText('Hello${state.userName}');}}
  • UI 只关心展示
  • 状态逻辑集中
  • 页面结构清晰

这套结构,在 React、Flutter、甚至 SwiftUI 中都成立。

总结

Flutter 走向“状态管理百家争鸣”,不是偶然,而是必然:

  • 声明式 UI → 状态成为核心资产
  • 项目变大 → 状态必然外提
  • 外提之后 → 就一定会有流派之争

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1125172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek对于DuckDB on LoongArch一文的总结

原文地址 https://duckdb.org/2026/01/06/duckdb-on-loongarch-morefine用中文总结附件这是一篇由 Hannes Mhleisen 于2026年1月6日撰写的技术博客&#xff0c;主要内容为在基于龙芯架构&#xff08;LoongArch&#xff09;的龙芯CPU设备&#xff08;MOREFINE M700S&#xff09;…

学长亲荐2026自考AI论文工具TOP10:选对工具轻松过关

学长亲荐2026自考AI论文工具TOP10&#xff1a;选对工具轻松过关 2026年自考AI论文工具测评&#xff1a;选对工具&#xff0c;事半功倍 随着人工智能技术的不断进步&#xff0c;越来越多的自考生开始借助AI写作工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的工具&…

Springboot品牌购物官网rmu1i本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能&#xff1a;开题报告内容进度安排&#xff1a;1、XXXX年X月X日-XXXX年X月XX日&#xff1a;完成前期资料的搜集与整理&#xff0c;撰写开题报告以及开题PPT。2、XXXX年X月X日-XXXX年X月XX日&#xff1a;设计完成系统的总体框架。3、XXXX年X月X日-XXXX年…

一文看懂 NVIDIA 平台全栈:从 CUDA 到 Jetson / DRIVE / Isaac 的当下走向

&#x1f4fa; B站视频讲解&#xff08;Bilibili&#xff09;&#xff1a;https://www.bilibili.com/video/BV1k1C9BYEAB/ &#x1f4d8; 《Yocto项目实战教程》京东购买链接&#xff1a;Yocto项目实战教程 一文看懂 NVIDIA 平台全栈&#xff1a;从 CUDA 到 Jetson / DRIVE / …

群体智能 AI Agent:多个 LLM 协作的分布式系统

群体智能 AI Agent:多个 LLM 协作的分布式系统 关键词:群体智能、AI Agent、大型语言模型(LLM)、分布式系统、多 LLM 协作 摘要:本文围绕群体智能 AI Agent 这一多个 LLM 协作的分布式系统展开深入探讨。首先介绍了该系统提出的背景、目的、适用读者及文档结构等信息。接着…

nums.sort()和nums.sort((a, b) => a - b)

这两者有重要区别&#xff1a; nums.sort() 默认按字符串排序&#xff08;字典序&#xff09;&#xff0c;即使数组里是数字也会被转换为字符串再比较&#xff1a; let nums [100, 4, 200, 1, 3, 2]; nums.sort(); // [1, 100, 2, 200, 3, 4] console.log(nums); // 错误的顺序…

吐血推荐10个AI论文网站,自考本科论文格式规范必备!

吐血推荐10个AI论文网站&#xff0c;自考本科论文格式规范必备&#xff01; 自考论文写作的“神器”正在改变你的学习方式 在自考本科论文写作过程中&#xff0c;许多学生都面临一个共同难题&#xff1a;如何高效完成一篇符合格式规范、内容严谨的论文。尤其是在当前AIGC技术广…

大数据领域数据安全防护的最佳实践分享

大数据安全不踩坑&#xff1a;10个实战派最佳实践帮你守住数据生命线 引言&#xff1a;大数据时代&#xff0c;你的数据安全防线牢吗&#xff1f; 当企业每天处理TB级甚至PB级数据时&#xff0c;一次数据泄漏可能引发连锁反应&#xff1a; 某电商平台因用户订单数据未加密&…

大数据领域数据安全防护的最佳实践分享

大数据安全不踩坑&#xff1a;10个实战派最佳实践帮你守住数据生命线 引言&#xff1a;大数据时代&#xff0c;你的数据安全防线牢吗&#xff1f; 当企业每天处理TB级甚至PB级数据时&#xff0c;一次数据泄漏可能引发连锁反应&#xff1a; 某电商平台因用户订单数据未加密&…

Springboot劳务派遣人事系统gjfr3(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能&#xff1a;用工单位,劳动者,岗位招聘,劳务派遣,工资账套开题报告内容一、选题背景与意义&#xff08;一&#xff09;选题背景随着劳务派遣市场的快速发展&#xff0c;其作为一种灵活高效的用工方式&#xff0c;被越来越多的企业所采用。据人社部统计…

分页(Paging)完全解析

分页&#xff08;Paging&#xff09;完全解析 &#x1f3af; 一句话概括 分页 把内存切成固定大小的页&#xff0c;通过页表实现虚拟地址到物理地址的映射&#xff0c;让程序以为自己拥有连续的大内存&#xff0c;实际物理内存可以是不连续的碎片。 &#x1f3d7;️ 核心概念&…

分页(Paging)完全解析

分页&#xff08;Paging&#xff09;完全解析 &#x1f3af; 一句话概括 分页 把内存切成固定大小的页&#xff0c;通过页表实现虚拟地址到物理地址的映射&#xff0c;让程序以为自己拥有连续的大内存&#xff0c;实际物理内存可以是不连续的碎片。 &#x1f3d7;️ 核心概念&…

MCP 很火,来看看我们直接给后台管理系统上一个 MCP?

一、什么是 MCP 引用一些官方的介绍吧&#xff1a; Model Context Protocol (MCP) 是一个开放协议&#xff0c;它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能。无论你是构建 AI 驱动的 IDE、改善 chat 交互&#xff0c;还是构建自定义的 AI 工作流&#xff0c;MCP 提…

大数据领域Doris与MongoDB的集成方案

大数据领域Doris与MongoDB的集成方案&#xff1a;从业务痛点到实时分析的完美闭环 1. 引入&#xff1a;当“灵活存储”遇到“实时分析”的两难 凌晨2点&#xff0c;电商运营小李盯着电脑屏幕皱起眉头——他要统计“618大促期间&#xff0c;华南地区18-25岁用户的商品浏览→加购…

美团Java后端Java面试被问:Kafka的零拷贝技术和PageCache优化

1. 零拷贝技术&#xff08;Zero-Copy&#xff09; 传统数据拷贝流程&#xff08;4次拷贝&#xff0c;4次上下文切换&#xff09; java 复制 下载 // 传统文件读取发送流程&#xff08;非零拷贝&#xff09; 1. 磁盘 → 内核缓冲区&#xff08;DMA拷贝&#xff09; 2. 内核缓…

导师严选10个AI论文写作软件,专科生轻松搞定毕业论文!

导师严选10个AI论文写作软件&#xff0c;专科生轻松搞定毕业论文&#xff01; AI 工具如何让论文写作变得轻松高效 在当前的学术环境中&#xff0c;越来越多的学生开始借助 AI 工具来辅助论文写作。尤其是对于专科生而言&#xff0c;面对繁重的论文任务&#xff0c;传统的写作方…

HeiXi 配置 Metahuman

效果&#xff1a;PlayerStart(实例) 配置&#xff1a;位置 (0,149,120)角度&#xff1a;(0,-10,-90)

导师严选10个一键生成论文工具,本科生毕业论文必备!

导师严选10个一键生成论文工具&#xff0c;本科生毕业论文必备&#xff01; 论文写作的“救星”来了&#xff0c;AI 工具如何帮你轻松应对毕业压力&#xff1f; 对于本科生来说&#xff0c;撰写毕业论文不仅是学术能力的考验&#xff0c;更是时间与精力的双重挑战。而随着 AI 技…

高德扫街榜2026发布:首个全季节、全品类、全人群和全球化的真实榜单

2026年1月7日&#xff0c;阿里巴巴集团旗下高德正式发布高德扫街榜2026——在原有的“真实”核心理念基础上&#xff0c;围绕数字、信任与科技三大核心力量全面升级&#xff0c;发布了飞行街景、时令榜单、AR实景、好友动态等一系列新功能&#xff0c;推动生活服务榜单进入“比…

The following modules are missing or built with a different engine version:

The following modules are missing or built with a different engine version:我把 插件ACEUnrealPlugin-5.3 放到一个ue5.6项目的Plugins中&#xff0c;打开ue5.6项目然后5.6再打开就报异常&#xff1a;The following modules are missing or built with a different engine…