Flutter for OpenHarmony 实战:flutter_redux 全局状态机与单向数据流

【Flutter】Flutter Redux 入门:解决状态管理的问题 Flutter Redux 是 Redux 在 Flutter 中的实现。它提供了一些工具,使我们能够在 Flutter 应用中方便地使用 Redux。通过使用 Flutter Redux,我们可以更好地组织和管理应用的状态,使得代码更加清晰,更易于维护和测试。 阅读详情

Flutter for OpenHarmony 实战:flutter_redux 全局状态机与单向数据流

在这里插入图片描述

前言

在中大型应用开发中,“状态管理”往往是决定代码可维护性的分水岭。如果你希望在 HarmonyOS NEXT 上构建一套逻辑高度严密、变更完全可追溯的复杂应用,那么传统的状态管理方式可能会让你力不从心。

作为前端领域最经典的架构模式,Redux 及其 Flutter 实现 flutter_redux,凭借其强制性的“单向数据流”契约,能让你的鸿蒙应用状态变得像时钟一样精准、可预测。本文将带你从零开始,在鸿蒙平台上玩转 Redux。


一、 集成指南:在鸿蒙项目中启用 Redux

1.1 添加依赖

在你的 pubspec.yaml 中添加以下依赖。由于 Redux 逻辑纯粹,它对鸿蒙 SDK 有极佳的兼容性:

dependencies:
  redux: ^5.0.0          # Redux 核心逻辑
  flutter_redux: ^0.10.0 # Flutter 与 Redux 的连接桥梁

1.2 安装指令

在终端运行:

flutter pub get

在这里插入图片描述


二、 Redux 的核心哲学

在编写代码前,必须理解 Redux 的三大铁律:

  1. Store (单一数据源):整个应用的 State 被存储在一个对象树中,它是唯一的。
  2. Actions (声明变化):改变状态的唯一方式是 Dispatch(派发)一个 Action。
  3. Reducers (纯函数执行):它是逻辑的处理器,接收旧 State 和 Action,返回新 State。严禁在 Reducer 中执行异步或副作用操作。

三、 实战:构建鸿蒙“任务管理中心”

简单的计数器不足以体现 Redux 的威力。我们来实现一个支持增删任务的“任务中心”。

3.1 核心逻辑定义 (Redux 三剑客)

// 1. 定义 AppState (State)
class AppState {
  final List<String> items;
  AppState({this.items = const []});
}

// 2. 定义 Actions
class AddItemAction {
  final String item;![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/85caead1988c44cb9220a1f9ae63c892.png)

  AddItemAction(this.item);
}
class RemoveItemAction {
  final String item;
  RemoveItemAction(this.item);
}

// 3. 定义 Reducer (逻辑处理器)
AppState appReducer(AppState state, dynamic action) {
  if (action is AddItemAction) {
    return AppState(items: List.from(state.items)..add(action.item));
  }
  if (action is RemoveItemAction) {
    return AppState(items: List.from(state.items)..remove(action.item));
  }
  return state;
}

3.2 UI 连接:StoreConnector 的妙用

在页面中,我们通过 StoreConnector 取代传统的 setState:

// 💡 读取状态:展示任务总数
StoreConnector<AppState, int>(
  converter: (store) => store.state.items.length,
  builder: (context, count) => Text('待办任务: $count'),
),

// 💡 触发动作:添加任务
StoreConnector<AppState, OnItemAddedCallback>(
  converter: (store) => (name) => store.dispatch(AddItemAction(name)),
  builder: (context, callback) => ElevatedButton(
    onPressed: () => callback('新任务'),
    child: Text('添加'),
  ),
),

在这里插入图片描述


四、 进阶实战:构建多维度的“用户中心”

在实际的鸿蒙工程中,状态往往不是简单的列表,而是包含多种信息的复杂对象。这里我们演示如何管理一个包含姓名、余额、VIP 状态的用户模型。

4.1 核心逻辑定义:Immutable 模型与 Reducer

// 1. 复杂状态模型:使用 copyWith 模式保证不可变性
class UserState {
  final String name;
  final double balance;
  final bool isVip;

  UserState({required this.name, required this.balance, required this.isVip});

  UserState copyWith({String? name, double? balance, bool? isVip}) {
    return UserState(
      name: name ?? this.name,
      balance: balance ?? this.balance,
      isVip: isVip ?? this.isVip,
    );
  }
}

// 2. 定义 Actions
class TopUpAction {
  final double amount;
  TopUpAction(this.amount);
}

class ToggleVipAction {}

// 3. Reducer 实现:精准更新部分状态
UserState userReducer(UserState state, dynamic action) {
  if (action is TopUpAction) {
    return state.copyWith(balance: state.balance + action.amount);
  }
  if (action is ToggleVipAction) {
    return state.copyWith(isVip: !state.isVip);
  }
  return state;
}

4.2 引入 ViewModel 聚合模式

当 UI 组件只需要 Store 中的部分数据时,直接监听整个 Store 会导致耦合。我们推荐使用 ViewModel 模式进行聚合转换,这在大型鸿蒙项目中能显著降低维护成本:

// 💡 定义聚合 ViewModel,只提取 Header 关心的字段
class _ProfileViewModel {
  final String name;
  final bool isVip;
  _ProfileViewModel({required this.name, required this.isVip});

  static _ProfileViewModel fromStore(Store<UserState> store) {
    return _ProfileViewModel(
      name: store.state.name,
      isVip: store.state.isVip,
    );
  }
}

4.3 UI 层实现:跨组件的状态驱动

在页面中,不同位置的“余额显示”和“VIP 标识”通过 StoreConnector 高效同步:

// 💡 演示:在个人中心页读取聚合状态
StoreConnector<UserState, _ProfileViewModel>(
  converter: (store) => _ProfileViewModel.fromStore(store),
  builder: (context, vm) => CircleAvatar(
    backgroundColor: vm.isVip ? Colors.amber : Colors.blueGrey,
    child: Text(vm.name[0]),
  ),
),

在这里插入图片描述


五、 鸿蒙平台的性能与架构调优

5.1 性能杀手锏:distinct 属性

在鸿蒙端,为了确保 UI 的极致流畅(120Hz),我们应避免无效的重绘。
StoreConnector 的 distinct: true 属性非常关键:它会自动比对 converter 的返回值,只有当数据真正发生变化时,才会调用 builder。

5.2 处理副作用:Middleware (中间件)

当涉及鸿蒙端持久化存储(如预置数据库)或网络请求时,不能写在 Reducer 里。
建议集成 redux_thunk。它允许你的 Action 返回一个带有异步逻辑的函数:

// 💡 Thunk Action 示例
ThunkAction<AppState> saveTaskToDatabase(String task) {
  return (Store<AppState> store) async {
    // 模拟调用鸿蒙原生存储 API
    await database.save(task); 
    // 存储成功后派发真正的 Action 更新 UI
    store.dispatch(AddItemAction(task));
  };
}

六、 总结

Redux 不仅仅是一种状态管理库,更是一套成熟的工程架构方案。它通过 “单一状态树” 保证了数据源的唯一,通过 “不可变性” 保证了逻辑的可预测,通过 “ViewModel 聚合” 保证了 UI 的解耦。在 HarmonyOS NEXT 的大型项目迭代中,flutter_redux 定能助你构建出稳如磐石的应用架构。


欢迎加入开源鸿蒙跨平台社区:开源鸿蒙跨平台开发者社区

【Flutter】包管理(8)Flutter 状态管理 Flutter Redux 深入 构建复杂应用的状态管理方案 在这篇文章中,我们深入探讨了 Flutter Redux 的高级使用,包括如何处理异步操作,如何使用 Middleware,如何组合多个 reducer,以及如何在一个具体的示例中使用 Redux。 阅读详情

相关推荐

LangChain4j + Milvus 从0-1实现会话管理与RAG检索的AIChat超详细教程

本教程将介绍如何使用LangChain4j和Milvus向量数据库构建一个具备流式输出、会话管理、会话隔离和基于文档RAG检索能力的AI机器人。我们将使用阿里百炼模型作为LLM后端,并通过Docker部署Milvus向量数据库。创建Assistant接口,定义聊天服务:LangChain4j 中文文档 | LangChain4j 中文文档wiringMode :这个属性一般两种,一种是自动装配,我们这里选择手动配置。

2301_80014343的博客 1428

Flutter完整开发实战详解(四、 Redux、主题、国际化)

这里也为想要学习Flutter的朋友们准备了两份学习资料《Flutter Dart语言编程入门到精通》《Flutter实战》,从编程语言到项目实战,一条龙服务!!

Android 开发架构 1530

[小梅哥FPGA] 如何通过动态重配置实现FPGA时钟的实时频率/相位/占空比调整?

PLL和MMCM是实际存在的硬件电路,用以对输入时钟的负面变化,如抖动、频率变化、相位偏移、占空比失真等进行处理。基于该表,用户在初始化Clk_Wiz后,只需要计算好所需的频率、相位、占空比对应的设置值,使用Xil_Out32函数配置对应寄存器即可。通过上述步骤,在平时的开发调试过程中,亦或是一些对于时钟可能有着实时性要求的设计(如数据采集、图像处理)里,我们便可以在无需重新修改设计的前提下,通过AXI4总线来完成对时钟频率、相位的调控,从而达到缩短设计周期以及让设计适应更多场景的目的。

zgmxs的专栏 2486

Flutter之状态管理(Redux)flutter_redux

Flutter是Google(全球顶级互联网科技公司)的生的,后台够硬,毫无疑问Flutter即将或已经成为跨平台开发的主流,Flutter野心很大,不仅冲击着原生开发,而且很有可能会烧到Web前端。作为移动端开发者的你,如果不关注Flutter的话,实在说不过去啦! 跨组件状态共享(Provider)的应用 一、效果图 界面初始化状态 点击按钮发起一个Redux Action更新界面(即更新S...

XiNanHeiShao的专栏 2014

Openwifi 开源项目解读(一)

Openwifi wifi 80211 无线网卡 基带 FPGA linux 驱动 开源

2万+

【测绘程序设计】——潮汐调和分析

最小二乘潮汐调和分析源码、使用示例及数据

C_xxy's blog 2650

使用 Redux 在 Flutter&鸿蒙next 中实现状态管理

Redux 是一个专注于“单一状态树”的状态管理模式。单一数据源:应用的整个状态存储在一个全局的 store 中,而不是分散在各个组件中。状态是只读的:唯一能改变状态的方式是触发一个“动作”(Action)。动作描述了事件的发生,但不直接修改状态。使用纯函数来修改状态:状态的修改是通过 reducers 来完成的,reducer 是一个纯函数,它接收当前状态和动作,返回新的状态。在 Redux 中,动作是描述要执行什么操作的对象。在 Flutter 中,通常我们会为每个界面或者功能模块定义不同的动作。

小淼淼的博客 1401

milvus | 第 1 章:从“相似图片搜索”理解 Milvus 向量数据库

本文介绍了向量数据库Milvus的核心概念和基本架构。主要内容包括:1)向量数据库解决的是高维向量相似度检索问题,通过Embedding将非结构化数据转换为向量进行比较;2)Milvus作为分布式向量数据库,包含Proxy、Coordinator、QueryNode等多个组件协同工作;3)关键概念如Collection、Schema、Segment等构成了Milvus的数据组织方式;4)典型使用流程包括创建集合、插入数据、构建索引、加载数据和执行搜索五个步骤。文章为后续深入理解Milvus源码提供了基础知识

weixin_43674738的博客 122

Flutter Redux 使用教程

Flutter Redux 是一个基于 Redux 状态管理模式的 Flutter 库,它帮助开发者管理应用的状态,使得状态的变化更加可预测和易于调试。Redux 的核心思想是将应用的状态集中管理,通过单向数据流来更新 UI,从而简化状态管理的复杂性。 ## 项目快速启动 ### 安装依赖 首先,在 `pubspec.yaml` 文件中添加 `flutter_redux` 依赖: ```y...

gitblog_00222的博客 792

备战2025数学建模国赛(算法65):Fisher判别分析

在数学建模竞赛中,我们常常会遇到需要对研究对象进行分类或判断的问题。例如,根据西瓜的各类指标判断其好坏,根据经济数据判断一个国家的发展程度,或根据病人的医学影像特征判断其是否患病。这类“分类判别”问题,是建模竞赛中最常见的题型之一。Fisher判别分析(或称线性判别分析,LDA)作为一种经典的、有监督的降维与分类方法,因其模型简洁、可解释性强、计算高效而备受青睐。

YOLO 415

4-都2026年了,嵌入式发展前景怎么样,还适合入行吗?

本文系统分析了嵌入式行业的发展前景,指出到2026年嵌入式将迎来由"万物智联"驱动的黄金周期。文章回顾了嵌入式技术的四个演进阶段,从专用计算机到AIoT时代,强调其技术积累的延续性。作者从人才流向、产业智能化转型、高校新增专业等角度论证嵌入式行业的蓬勃发展,并提出"铁三角"模型分析其驱动力和护城河。最后给出职业发展路径建议,认为嵌入式适合长期主义者,在智能汽车、边缘计算等领域有广阔前景。文章建议读者抓住产业升级机遇,选择这一稳定且有复利效应的技术赛道。

指尖动听知识库 386

Flutter 三方库 built_redux 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、基于不可变模型(Immutability)的工业级 Redux 状态审计与内存治理引擎

什么是 Built Redux?它是一个将“由于由于不可变性(Immutability)”与“由于由于 Redux 全局状态机”深度融合的算力中枢。由于由于。传统的。管理过程。由于由于状态管理由于于由于对Store的由于由由可变由于操作。管理过程。导致由于由于由于数据竞争。在 Flutter for OpenHarmony 的实际开发中,利用该库,我们可以实现由于由于鸿蒙应用对应的。状态包。管理过程。由于由于极致由于由于。它是构建“极致稳健、状态追踪”鸿蒙应用后的核心资源审计内核。

jiang_style的博客 3462

世界职业院校技能大赛财经赛道项目参考逐字稿五

世界职业院校技能大赛财经赛道项目参考逐字稿五

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 106

2亿用户背后的Flutter最新开源框架;Fish-Redux,腾讯T3面试官透露

总而言之,成功是留给准备好的人的。无论是参加什么面试,都要做好充足的准备,注意好面试的礼仪和穿着,向面试官表现出自己的热忱与真诚就好。即使最后没有过关,也要做好经验的总结,为下一次面试做好充足准备。这里我为大家准备了一些我在面试后整理的面试专题资料,除了面试题,还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家,希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

feifei99_8820的博客 1331

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Flutter架构示例:Redux状态管理深度解析

在Flutter应用开发中,状态管理一直是核心话题。本文将以brianegan的flutter_architecture_samples项目中的Redux实现为例,深入剖析Redux在Flutter中的最佳实践。 ## Redux基础概念 Redux是一种可预测的状态容器,其核心思想可以概括为三个基本原则: 1. **单一数据源**:整个应用的状态存储在一个不可变的对象树中 2. **状态只...

gitblog_00509的博客 457

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

3 分钟装好 NewJob:职位最后更新时间一眼看清

刷职位列表时,新岗位旁边常夹着半年前的陈年旧岗。招聘扩展 **NewJob** 直接解决这个问题:它在智联、51job、拉钩的 PC 端列表里,给每个职位打上绿色、橙色、红色三色的最后更新时间标签——绿的还活跃,红的早凉了,简历别再往旧岗上砸。整个安装加载过程大约 3 分钟。 ## 先花 1 分钟判断:你适不适合装 NewJob 是一个 Chrome 扩展(浏览器加载的附加程序,不是独立软件)

gitblog_00884的博客 977

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Flutter Redux详细基础使用教程

Flutter Redux使用教程 网上的一些教程就是现从官方文档的最基础例子搬运过来的,无法给偏向基础的新手讲清楚Flutter_Redux,也无法让新人设置自己的项目结构。博主结合官网例子,和一些大神的项目,总结了一些使用经验,希望能帮助到你。 依赖配置 ​ 在项目的根路径,找到pubspec.yaml文件。这个文件用来定义我们Flutter项目的依赖,下图是还没有配置redux的原始文件...

yhy1315的博客 2031

Flutter 状态管理之Redux

Flutter中一切皆组件(Widget),二组件中又有无状态的StatelessWidget和有状态的StatefulWidget两种;今天我们就来说一说StatefulWidget中的State的状态管理。一般我们有两种方式对state进行管理,一种是自己管理,一种是交给父组件管理。 自己管理:也就是组件自身通过setState来管理状态,通过手动触发setState来进行U...

qq_19979101的博客 2112

flutter_redux

redux 组成 Store :用于存储和管理State,所有的状态都储存在Store里,Store会放在App顶层 Action:用户触发的一种行为 Reducer:根据Action产生新的State,State状态是由reducer生成并储存在Store里面的。Store更新状态的时候,并不是更改原来的状态对象,而是将reducer生成的新的状态对象替换掉老的状态对, 过程: 通过发起一个action来告诉Reducer,状态要发生变化了,这是 Reducer会收到 一个action,然后根据收到的a

lin_henry的博客 863

Flutter笔记--flutter-redux

这一节主要了解flutter-redux的用法,redux之前是用在React中的状态管理,一般较大型React项目用的较多,简单了解一下一些概念: (1)store:是保存数据的地方。整个应用只能有一个 Store 。Store 有十分重要的方法 dispatch(action) 来发送 Action。(2)State,是某个时间点的数据快照, 一个 State 对应一个 View。只要 State 相同,View 就相同。(3)Action:是 View 发出的通知,通过 Reduce...

ljt2724960661的博客 1579

Flutter 状态管理之 Scoped Model & Redux

前言 文章原文地址:Nealyang/PersonalBlog 可能作为一个前端,在学习 Flutter 的过程中,总感觉非常非常相似 React Native,甚至于,其中还是有state的概念 setState,所以在 Flutter 中,也当然会存在非常多的解决方案,比如 redux 、RxDart 还有 Scoped Model等...

weixin_33910434的博客 308

Flutter UI状态管理工具:Redux

在 Flutter Redux 中,StoreBuilder 是一个用于构建基于 Redux store 状态的 UI 组件的工具。 function有如下两种定义方式: StoreBuilder:监听整个应用程序的状态 StoreBuilder:监听特定页面的状态(HomePageState)

夏目艾拉的学习之路 358

Flutter完整开发实战详解(四、 Redux、主题、国际化) | 掘金技术征文

作为系列文章的第四篇,本篇主要介绍 Flutter 中 Redux 的使用,并结合Redux 完成实时的主题切换与多语言切换功能。 前文: 一、Dart语言和Flutter基础 二、 快速开发实战篇 三、 打包与填坑篇 Flutter 作为响应式框架,通过 state 实现跨帧渲染的逻辑,难免让人与 React 和 React Native 联系起来,而其中 React 下*“广为人知”*...

weixin_34283445的博客 604

Flutter主流状态管理框架provider、bloc、redux对比

为什么需要状态管理 provider bloc redux 对比 总结 为什么需要状态管理 在了解和进行Flutter状态管理框架对比之前呢,我们先来问自己一个问题:为什么需要状态管理? 如果我们的应用足够简单,Flutter作为一个声明式框架,我们或许只需要将数据映射成视图就可以了。我们可能并不需要状态管理,就像下面这张图: 但是随着功能的增加,我们的应用程序将会有几十个甚至上百个状态。这个时候我们的应用将会变成这样: 在这种情况下我们很难再清楚的...

唐僧的专栏 6507

Flutter之Redux

Flutter之Redux 导入库 dependencies: flutter_redux: ^0.6.0 redux: ^4.0.0 创建传递数据的实例,行为,初始化 // 第一步 class User { String name; int age; User.initState() { // 初始化数值 name = "张三"; age = 10; } User(this.name, this.age); } // 第二步 User reduce

小小熊的博客 482
上一篇: Flutter for OpenHarmony 实战:just_audio 音乐播放器深度适配与进阶
下一篇: Flutter for OpenHarmony 实战:MobX 声明式状态管理的高性能适配
苏沁宁
博客等级 码龄1年 1万+粉丝 2206原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值