Flutter-Notebook 实战:使用 Redux 在 Flutter 中实现跨页面共享状态(redux_demo 源码解析)
示例工程移动开发【免费下载链接】Flutter-NotebookFlutterDemo合集今天你fu了吗项目地址https://gitcode.com/gh_mirrors/fl/Flutter-Notebook点击查看免费下载本文基于 Flutter-Notebook 仓库中的 redux_demo 示例完整讲解如何在 Flutter 应用中引入 Redux 单向数据流架构通过 Store、Action、Reducer 与 StoreConnector 实现在不同页面之间共享并同步同一份状态。读完本文你将掌握redux与flutter_redux两个核心库的协作方式并能在自己的项目里复刻这套计数器跨页面共享的最小可运行架构。一、示例背景为什么需要 Reduxredux_demo 是 Flutter-Notebook 众多示例中专门演示使用 Redux 在 Flutter 中共享状态的工程。它的核心场景是两个独立页面TopScreen 与 UnderScreen需要读取同一个计数值并且在一个页面里修改后另一个页面要同步更新。在传统写法中这种跨页面共享往往依赖回调、全局单例或层层传递参数页面多了之后会变得难以维护。Redux 将状态管理收敛为一条单向数据流规避了上述问题。示例在 README.md 中明确点明主题使用 redux在 flutter 中共享状态的 demo。在动手阅读源码之前先建立 Redux 的三个基础概念概念作用对应本示例Store全局唯一的状态仓库持有当前 State接收 Action 并调用 Reducer 生成新 StateStoreCountStateAction描述发生了什么的普通对象或枚举不携带逻辑Action.incrementReducer纯函数根据旧 State 与 Action 计算出新 Statereducer(CountState state, action)二、工程结构一览redux_demo 采用经典 Flutter 工程布局核心代码集中在lib/目录下mecury_project/example/redux_demo/lib/ ├── main.dart # 入口创建 Store用 StoreProvider 注入全局 ├── states/ │ └── count_state.dart # 定义 State、Action 枚举与 reducer ├── top_screen.dart # 页面一通过 StoreConnector 读取计数值 └── under_screen.dart # 页面二读取计数值并派发 Action 修改从文件划分可以看出示例把状态的定义与变更逻辑states/与UI 展示两个 Screen完全分离这正是 Redux 架构的核心收益之一。测试文件位于 test/widget_test.dart当前为空的脚手架后续可在此基础上编写针对 reducer 与页面的测试。三、依赖配置redux 与 flutter_redux在 pubspec.yaml 中示例声明了两个关键依赖dependencies: flutter: sdk: flutter cupertino_icons: ^0.1.2 redux: ^3.0.0 # 纯 Dart 的 Redux 核心实现 flutter_redux: ^0.5.2 # 连接 Redux 与 Flutter Widget 的桥接层两者的分工值得说明redux纯 Dart 包提供Store、Reducer等核心类型不依赖任何 UI 框架可在纯 Dart 逻辑层使用flutter_redux在 redux 之上提供StoreProvider、StoreConnector等 Widget负责把 Store 注入组件树并在状态变化时自动重建订阅它的 Widget。由于 demo 生成时间较早SDK 约束为sdk: 2.0.0-dev.68.0 3.0.0若在较新版本的 Flutter 环境复现需要相应升级依赖版本。四、定义 State、Action 与 Reducer状态相关的全部逻辑集中在 count_state.dart三部分内容对应 Redux 的三个核心概念4.1 只读的 Stateimport package:meta/meta.dart; /** * State中所有属性都应该是只读的 */ immutable class CountState { final int _count; get count _count; CountState(this._count); CountState.initState() : _count 0; }要点用immutable注解标记整个类配合final int _count保证状态字段一旦创建不可修改对外只暴露 gettercount外部无法直接改写内部值CountState.initState()是命名构造函数提供初始状态_count 0供创建 Store 时使用。这是 Redux 的重要约定State 不可变任何更新都通过生成新对象完成从而保证状态变化可追踪、可回溯。4.2 用枚举表达 Action/** * 定义操作该State的全部Action * 这里只有增加count一个动作 */ enum Action { increment }demo 只有一个动作增加计数因此直接用 Dart 枚举表达。更复杂的业务中通常会为每个 Action 定义携带 payload 的类。4.3 纯函数 Reducer/** * reducer会根据传进来的action生成新的CountState */ CountState reducer(CountState state, action) { //匹配Action if (action Action.increment) { return CountState(state.count 1); } return state; }reducer 是 Redux 中唯一允许修改状态的地方且必须是纯函数入参为旧 State 与 action匹配到Action.increment时返回一个新对象CountState(state.count 1)而不是修改旧对象未匹配任何 Action 时原样返回旧 State注意这里按 demo 原始实现返回state即同一个引用。五、创建 Store 并注入全局5.1 入口创建 Storemain.dart 的第 711 行创建了全局唯一的 Storevoid main() { final store StoreCountState(reducer, initialState: CountState.initState()); runApp(new MyApp(store)); }StoreCountState指定状态泛型第一个参数传入reducer所有 dispatch 的 Action 都会流经它initialState: CountState.initState()指定初始计数值为 0。MyApp接收 store 并把它保存为成员变量class MyApp extends StatelessWidget { final StoreCountState store; MyApp(this.store); ... }5.2 用 StoreProvider 向全树注入return StoreProviderCountState( store: store, child: new MaterialApp( title: Flutter Demo, theme: new ThemeData( primarySwatch: Colors.blue, ), home: TopScreen(), ), );StoreProviderCountState是 flutter_redux 提供的 InheritedWidget 类组件位于组件树顶层。它的作用是把 store 注入 Widget 树使树中任意位置的StoreConnector都能拿到同一个 Store——这正是跨页面共享状态的基础两个页面虽然在导航栈中是不同路由但它们都挂在同一个StoreProvider之下。六、用 StoreConnector 读取状态6.1 TopScreen只读展示top_screen.dart 的页面主体通过StoreConnectorCountState,int订阅状态body: Center( child: StoreConnectorCountState,int( converter: (store) store.state.count, builder: (context, count) { return Text( count.toString(), style: Theme.of(context).textTheme.display1, ); }, ), ),两个泛型参数分别表示CountStateStore 中的状态类型与intconverter 转换后的输出类型。核心机制converter把整个 Store 转换为页面需要的子集这里取出store.state.countintbuilder接收转换结果count构建 Text 展示计数值。StoreConnector会自动订阅 Store任何 reducer 产生新状态后converter 重新执行、builder 用新值重建 Widget无需手动setState。TopScreen 的浮动按钮只负责跳转到第二个页面UnderScreen不修改状态floatingActionButton: FloatingActionButton( onPressed: () { Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context){ return UnderScreen(); })); }, child: Icon(Icons.forward), ),6.2 UnderScreen读取并派发 Actionunder_screen.dart 是本例共享的关键它在另一个路由中读取同一个计数值并通过 dispatch 修改它。读取部分的写法与 TopScreen 完全一致StoreConnectorCountState,int( converter: (store) store.state.count, builder: (context, count) { return Text( count.toString(), style: Theme.of(context).textTheme.display1, ); }, ),而修改通过第二个StoreConnector完成converter 不再返回值而是返回一个派发动作的回调函数floatingActionButton: StoreConnectorCountState,VoidCallback( converter: (store) { return () store.dispatch(Action.increment); }, builder: (context, callback) { return FloatingActionButton( onPressed: callback, child: Icon(Icons.add), ); }, ),要点converter 输出类型改为VoidCallback返回闭包() store.dispatch(Action.increment)builder 拿到callback后把它绑定到按钮的onPressed点击按钮即向全局 Store 派发Action.incrementreducer 生成新 State两个页面上的StoreConnector同时收到更新并重建。七、完整数据流一次点击的完整旅程把上述代码串联起来一次在 UnderScreen 点击 的完整数据流为用户点击 UnderScreen 的 FloatingActionButton触发callback回调执行store.dispatch(Action.increment)Action 被送入全局 StoreStore 调用reducer(CountState, Action.increment)生成新对象CountState(state.count 1)Store 通知所有订阅者两个页面的StoreConnector每个StoreConnector重新执行 converter 取出新countbuilder 重建 Text 显示新值。由于两个页面共享同一个 Store即使 UnderScreen 是通过Navigator.push推入的新路由计数依然同步——这正是跨页面共享状态的直观体现也对应原文档中展示的 样例截图。八、如何运行与验证进入示例目录后按常规 Flutter 流程运行cd mecury_project/example/redux_demo flutter pub get # 拉取 redux / flutter_redux 等依赖 flutter run # 在设备或模拟器上运行验证共享行为在 TopScreen 点击右下角前进按钮进入 UnderScreen在 UnderScreen 点击 按钮计数加一返回 TopScreen 后可以看到同一计数值已同步更新TopScreen 中的StoreConnector同样订阅了 Store。九、从源码结构看可扩展方向从当前工程的源码结构可以推断出它是一套最小可运行的 Redux 骨架若要应用到真实项目可在此基础上扩展State 拆分当前CountState只有一个_count字段真实业务可将状态按模块拆分后用combineReducers组合Action 携带数据枚举 Action 无法携带 payload可改为类如class IncrementBy { final int value; }异步逻辑redux 生态中可引入redux_thunk或redux_epics处理网络请求等副作用补充测试test/widget_test.dart 目前是空壳建议针对 reducer 的纯函数特性编写单元测试给定旧 State 与 Action断言新 State 值这是 Redux 架构易于测试的直接收益。十、小结redux_demo 以不足百行核心代码演示了 Redux 在 Flutter 中的标准用法CountState不可变状态Action枚举事件描述reducer纯函数更新StoreProvider全局注入StoreConnector订阅与派发。其价值在于用最小成本展示了跨页面共享状态这一 Redux 最典型的使用场景是理解 Flutter-Notebook 中状态管理系列示例bloc_demo、scoped_demo 等的入门参照。若需要完整的第三方库用法文档可参考 redux 与 flutter_redux 的官方包说明本示例的 pubspec.yaml 中已给出对应的版本约束。赞分享示例工程移动开发【免费下载链接】Flutter-NotebookFlutterDemo合集今天你fu了吗项目地址https://gitcode.com/gh_mirrors/fl/Flutter-Notebook点击查看免费下载相关推荐Flutter-Notebook页面状态KeepAlive实现多页面状态保持Flutter Notebook页面状态KeepAlive实现多页面状态保持 在Flutter应用开发中页面切换时状态丢失是常见问题。用户在Tab页间切换时示例工程移动开发Flutter-Notebook状态管理Redux持久化实现Flutter Notebook状态管理Redux持久化实现 在移动应用开发中状态管理是确保用户体验流畅的核心环节。当应用需要在重启后保留用户数据或界面状态示例工程移动开发Flutter-Notebook状态管理Redux中间件应用Flutter Notebook状态管理Redux中间件应用 你是否在Flutter开发中遇到过状态管理混乱的问题当应用复杂度提升时如何优雅地处理异步操作示例工程移动开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AI回答总提那几个大牌,小公司能挤进去吗

AI回答总提那几个大牌,小公司能挤进去吗

为什么AI回答里出现的总是那几个大牌?问ChatGPT、Perplexity或者Google AI Overview随便一个行业该选谁,答案里几乎都是知名大厂的名字,创业公司很少被提到——这不是运气,是大模型的训练方式和检索排名规则共同决定的。本文从预训…

2026/10/15 18:03:16 阅读更多 →
Natron 节点深度指南:ReadMisc——基于 ImageMagick 的多格式图像读取插件

Natron 节点深度指南:ReadMisc——基于 ImageMagick 的多格式图像读取插件

音视频视频处理图形学桌面应用 【免费下载链接】Natron Open-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry. 项目地址: https://gitcode.com/gh_mirrors/na/Natron 点击查看 …

2026/10/16 18:37:30 阅读更多 →
OSPF路由协议COST值计算与优化实践

OSPF路由协议COST值计算与优化实践

1. 网络路由选择的底层逻辑在IP网络的世界里,路由选择就像城市交通导航系统,而OSPF(Open Shortest Path First)协议就是其中最智能的导航算法之一。作为链路状态路由协议的代表,OSPF通过计算最短路径来决定数据包的转发…

2026/10/16 18:37:31 阅读更多 →

最新新闻

PB12票据打印实战:DataWindow套打对齐与PrintSend切纸钱箱控制

PB12票据打印实战:DataWindow套打对齐与PrintSend切纸钱箱控制

简介:面向PowerBuilder 12开发者的票据打印实现方案,聚焦自定义纸张票据打印,解决PB应用中票据模板设计、数据窗口布局、打印参数控制与动态数据填充等问题。压缩包共18个文件,涵盖PBL工程对象、PBT工程文件、HTML操作页面、GIF演…

2026/10/16 21:24:43 阅读更多 →
NX二次开发实战:UF_VEC3_distance计算两点距离与避坑指南

NX二次开发实战:UF_VEC3_distance计算两点距离与避坑指南

简介:本资源面向UG/NX二次开发初学者与需要定制几何计算功能的工程师,围绕UFUN函数库中UF_VEC3_distance的调用展开,解决三维空间中两点欧几里得距离的计算与集成问题。压缩包共25个文件,约3.4MB,包含cpp源代码、vcxpr…

2026/10/16 21:24:43 阅读更多 →
用音乐喜好构建用户画像:从听歌数据到智能选品推荐系统

用音乐喜好构建用户画像:从听歌数据到智能选品推荐系统

深夜加班回到家,我习惯把耳机戴上,随手点开一首歌。音乐一响,整个人就松弛了。那天我正盯着购物车里的三款降噪耳机犹豫——一款偏动次打次、一款偏人声解析、一款主打温润耐听。我突然冒出一个念头:与其反复看评测、刷评论&#…

2026/10/16 21:24:43 阅读更多 →
Python删除字典字段全攻略:del、pop、popitem与遍历删除实用技巧

Python删除字典字段全攻略:del、pop、popitem与遍历删除实用技巧

先跟大家说个事儿:如果你写过哪怕一点点Python,大概率逃不过“删除字典字段”这个操作。字典的增删改查是开箱即用的基本功,但真要动手删的时候,很多人会卡在“到底用del还是pop”“遍历的时候删键怎么老报错”“删完字典内存是不…

2026/10/16 21:24:43 阅读更多 →
MATLAB中NAR时间序列预测的工业级实现与避坑指南

MATLAB中NAR时间序列预测的工业级实现与避坑指南

简介:本资源是一份面向数据分析师与MATLAB初学者的实战型时间序列预测教学文档,聚焦非线性自回归(NAR)模型在MATLAB中的完整实现流程,解决从零构建、训练到评估预测模型的核心问题。资源为单文件docx格式,共…

2026/10/16 21:24:43 阅读更多 →
xsync集群分发工具原理与实战:基于rsync的生产级配置同步方案

xsync集群分发工具原理与实战:基于rsync的生产级配置同步方案

1. 为什么集群环境下“复制粘贴”根本走不通——xsync不是炫技,而是生存刚需刚接手某高校实验室的分布式计算平台时,我面对的是12台物理节点组成的Hadoop模拟集群。最开始,我习惯性地用scp一条条往每个节点传配置文件:scp core-si…

2026/10/16 21:23:43 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →