flutter 常见的状态管理器
flutter 常见的状态管理器
- 前言
- 一、Provider
- 二、Bloc
- 三、Redux
- 四、GetX
- 总结
前言

当我们构建复杂的移动应用时,有效的状态管理是至关重要的,因为应用的不同部分可能需要共享数据、相应用户交互并保持一致的状态。Flutter 中有多种状态管理解决方案,下面详细介绍一些常见的状态管理方式:Provider、Bloc 和 Redux、getx 等等一些管理工具。
一、Provider
Provider: Provider 是 Flutter 社区广泛使用的状态管理库,它使用了 InheritedWidget 和 ChangeNotifier 的概念来实现状态共享和更新。Provider 适用于中小型应用或对于简单状态共享的情况。
- InheritedWidget: InheritedWidget 是 Flutter 中的一种特殊的小部件,允许其子部件在其上方访问共享数据。
- ChangeNotifier: ChangeNotifier 是一个基类,可以帮助我们实现“可观察”的对象,它包含了状态并通知监听者当状态发生改变。
Provider 的工作原理是将数据模型(Model)包装在 ChangeNotifierProvider 中,然后通过 Consumer 或 Provider.of 来访问和监听状态变化。这种方式适用于相对简单的状态管理需求,如表单数据、主题等。
二、Bloc
Bloc(Business Logic Component): Bloc 是一种状态管理模式,专注于将业务逻辑从 UI 层分离出来。Bloc 模式建议将应用程序的状态、事件和业务逻辑分离开来,使应用更容易维护和测试。
- States: 状态表示应用程序的不同状态,如加载中、成功、失败等。
- Events: 事件表示用户操作或应用内的触发动作,例如按钮点击、数据请求等。
- Bloc: Bloc 将状态和事件联系起来,根据事件的发生来改变状态。
Bloc 模式通常与第三方库 flutter_bloc 一起使用,该库提供了 BlocProvider 和 BlocBuilder 等小部件来简化状态管理。
三、Redux
Redux: Redux 是一种通用的状态管理模式,最初用于 Web 应用,但也在 Flutter 中得到广泛应用。Redux 的核心思想是将应用的状态存储在一个全局的状态存储容器中,状态只能通过派发动作(Actions)来修改,从而实现单一数据源、可预测的状态变化。
- Store: 全局的状态存储容器,保存应用的状态。
- Actions: 表示状态的变化,需要一个类型和一些数据。
- Reducers: 根据接收到的 Action,更新状态并返回新的状态。
- Selectors: 用于从状态中选择特定的数据。
在 Flutter 中使用 Redux 需要使用第三方库,如 flutter_redux,该库提供了用于连接 Flutter 应用和 Redux Store 的小部件。
四、GetX
GetX 是一个在 Flutter 中提供状态管理和依赖注入的强大工具包。它为开发者提供了一种简单、高效的方式来管理应用程序的状态和依赖关系。下面让我们详细讲解一下 GetX 的状态管理器部分。
- 状态管理:
在 GetX 中,状态管理使用了名为 Rx 的类来表示可观察的数据。Rx 类是 GetX 的核心概念之一,它允许你将数据转换为可被监听的流,并且可以在数据发生变化时通知观察者。以下是一些重要的 Rx 类:
RxInt, RxDouble, RxString, …: 用于表示整数、浮点数、字符串等类型的可观察数据。
RxList, RxSet, RxMap: 用于表示集合类型的可观察数据。
RxBool: 用于表示布尔类型的可观察数据。
RxNotifier: 用于自定义对象的可观察数据。
dart
// 示例:使用 RxInt
final count = RxInt(0);// 监听数据变化
ever(count, (value) {print('Count changed to $value');
});// 更新数据
count.value++;
- 状态更新:
使用 GetX 更新状态非常简单。你可以直接通过 .value 属性来更新可观察数据的值。GetX 会自动通知订阅了该数据的观察者。
final count = RxInt(0);// 更新数据
count.value++; // 通知观察者数据变化
- 依赖注入:
GetX 也提供了依赖注入的功能,使得在应用中的不同部分共享实例变得容易。你可以使用 Get.put() 方法来注册实例,并且使用 Get.find() 来获取已注册的实例。
class MyController extends GetxController {// Your controller code
}// 注册控制器实例
Get.put(MyController());// 获取实例
MyController myController = Get.find<MyController>();
- GetBuilder 和 Obx:
GetBuilder: 这是一个小部件,它可以根据可观察数据的变化来重建部件树。你可以使用 GetBuilder 将小部件与可观察数据关联,使其在数据变化时自动重建。
Obx: 这是一个更轻量级的小部件,适用于只需要监听一个可观察数据的情况。你可以通过 Obx(() => YourWidget()) 的方式来实现。
5. 其他功能:
GetX 还提供了很多其他有用的功能,如路由管理、导航、国际化等,使得开发过程更加高效。你可以通过 Get.to() 和 Get.off() 等方法来进行页面导航,通过 Get.putAsync() 来异步注册依赖项等。
总结
无论选择哪种状态管理方式,都需要根据应用的规模、复杂性和开发团队的偏好来做出决定。这些状态管理模式的核心目标是有效地管理应用的状态,使代码结构清晰、易于维护,并提供良好的开发体验。
总体来说,GetX 是一个功能强大且易于学习的状态管理和依赖注入工具包,适用于各种规模和复杂度的 Flutter 应用程序。它的简洁语法和高性能使得开发者可以更专注于业务逻辑,而无需过多关注状态管理的细节。
相关文章:
flutter 常见的状态管理器
flutter 常见的状态管理器 前言一、Provider二、Bloc三、Redux四、GetX总结 前言 当我们构建复杂的移动应用时,有效的状态管理是至关重要的,因为应用的不同部分可能需要共享数据、相应用户交互并保持一致的状态。Flutter 中有多种状态管理解决方案&#…...
Kotlin的Map
在 Kotlin 中,Map 是一种键值对的集合数据结构,用于存储一组关联的键和值。Kotlin 标准库提供了 Map 接口和多种实现类,使得操作和处理键值对数据更加方便。下面详细描述 Kotlin 的 Map 的用法: 创建 Map Kotlin 提供了几种方式…...
STM32 串口复习
按数据通信方式分类: 串行通信:数据逐位按顺序依次传输。传输速率较低,抗干扰能力较强,通信距离较长,I/O资源占用较少,成本较低。并行通信:数据各位通过多条线同时传输。 按数据传输方向分类&…...
VScode替换cmd powershell为git bash 终端,并设置为默认
效果图 步骤 1. 解决VScode缺少git bash的问题_failed to start bash - is git-bash.exe on the syst_Rudon滨海渔村的博客-CSDN博客效果解决步骤找到git安装目录下的/bin/bash.exe,复制其绝对路径,例如D:\Program Files\Git\bin\bash.exe把路径的右斜…...
网络基础(一)桥接网络
网络基础知识 桥接网络 桥接网络是一种网络设计技术,其目的是将两个或多个网络段连接在一起,使它们在逻辑上表现为单个网络。这通过使用网络桥来实现,网络桥工作在数据链路层(第2层),只关心MAC地址&#…...
C#程序变量统一管理例子 - 开源研究系列文章
今天讲讲关于C#应用程序中使用到的变量的统一管理的代码例子。 我们知道,在C#里使用变量,除了private私有变量外,程序中使用到的公共变量就需要进行统一的存放和管理。这里笔者使用到的公共变量管理库划分为:1)窗体;2)…...
信息熵,信息增益,增益率的理解
西瓜数据集D如下: 编号色泽根蒂敲声纹理脐部触感好瓜1青绿蜷缩浊响清晰凹陷硬滑是2乌黑蜷缩沉闷清晰凹陷硬滑是3乌黑蜷缩浊响清晰凹陷硬滑是4青绿蜷缩沉闷清晰凹陷硬滑是5浅白蜷缩浊响清晰凹陷硬滑是6青绿稍蜷浊响清晰稍凹软粘是7乌黑稍蜷浊响稍糊稍凹软粘是8乌黑稍蜷浊响清晰…...
二级MySQL(一)——基本概念与方法
数据库系统的核心是【数据库管理系统】 E-R图提供了表示信息世界中的方法,主要有实体、属性和【联系】 E-R图是数据库设计的工具之一,一般适用于建立数据库的【概念模型】 将E-R图转换到关系模式时,实体与联系都可以表示成【关系】 关系数…...
13 Web全栈 pnpm
什么是pnpm? 可以理解成performant npm缩写 速度快、节省磁盘空间的软件包管理器 特点 快速- pnpm比其他包管理器快2倍高效- node_modules中的文件链接自特定的内容寻址存储库支持monorepos- 内置支持单仓多包严格- pnpm默认创建了一个非平铺的node_modules 因此代…...
回归预测 | MATLAB实现CSO-BP布谷鸟优化算法优化BP神经网络多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现CSO-BP布谷鸟优化算法优化BP神经网络多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现CSO-BP布谷鸟优化算法优化BP神经网络多输入单输出回归预测(多指标,多图)效果一览…...
JavaScript中的事件冒泡和事件捕获机制
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 事件冒泡和事件捕获机制⭐ 事件冒泡(Event Bubbling)⭐ 事件捕获(Event Capturing)⭐ 停止事件传播⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或…...
秋招面经——结合各方面试经验
Mysql mysql事务 共享锁与排他锁 共享锁:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。(读都允许读,但我在读不允许你去改) 排他锁:允许一个事务去读一行,阻止其他事务获得相同…...
Python random模块用法整理
随机数在计算机科学领域扮演着重要的角色,用于模拟真实世界的随机性、数据生成、密码学等多个领域。Python 中的 random 模块提供了丰富的随机数生成功能,本文整理了 random 模块的使用。 文章目录 Python random 模块注意事项Python random 模块的内置…...
【Redis从头学-5】Redis中的List数据类型实战场景之天猫热销榜单
🧑💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:Re…...
基于Python的HTTP代理爬虫开发初探
前言 随着互联网的发展,爬虫技术已经成为了信息采集、数据分析的重要手段。然而在进行爬虫开发的过程中,由于个人或机构的目的不同,也会面临一些访问限制或者防护措施。这时候,使用HTTP代理爬虫可以有效地解决这些问题࿰…...
时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测
时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计学习总结参考资料 预测效果 基本介绍 时序预测 | MATLAB实现WOA-…...
每日一题之二进制中1的个数
二进制中1的个数 问题描述: 输入一个整数 n ,输出该数 32 位二进制表示中 1 的个数。其中负数用补码表示。 科普一下有符号数的三种表示:原码、反码和补码,可能有时候遗忘了。 真值:带有符号位的机器数(一…...
8.17校招 内推 面经
绿泡泡: neituijunsir 交流裙,内推/实习/校招汇总表格 1、校招 | 腾讯2024校园招聘全面启动(内推) 校招 | 腾讯2024校园招聘全面启动(内推) 2、校招 | 大华股份2024届全球校园招聘正式启动(内推) 校招 | 大华股份2024届全球校园招聘正式启动(内推) …...
VScode搭建Opencv(C++开发环境)
VScode配置Opencv 一、 软件版本二 、下载软件2.1 MinGw下载2.2 Cmake下载2.3 Opencv下载 三、编译3.1 cmake-gui3.2 make3.3 install 四、 VScode配置4.1 launch.json4.2 c_cpp_properties.json4.3 tasks.json 五、测试 一、 软件版本 cmake :cmake-3.27.2-windows-x86_64 Mi…...
Redis高可用:哨兵机制(Redis Sentinel)详解
目录 1.什么是哨兵机制(Redis Sentinel) 2.哨兵机制基本流程 3.哨兵获取主从服务器信息 4.多个哨兵进行通信 5.主观下线和客观下线 6.哨兵集群的选举 7.新主库的选出 8.故障的转移 9.基于pub/sub机制的客户端事件通知 1.什么是哨兵机制…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
