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 一起使用,该库提供了 BlocProviderBlocBuilder 等小部件来简化状态管理。

三、Redux

Redux: Redux 是一种通用的状态管理模式,最初用于 Web 应用,但也在 Flutter 中得到广泛应用。Redux 的核心思想是将应用的状态存储在一个全局的状态存储容器中,状态只能通过派发动作(Actions)来修改,从而实现单一数据源、可预测的状态变化。

  • Store: 全局的状态存储容器,保存应用的状态。
  • Actions: 表示状态的变化,需要一个类型和一些数据。
  • Reducers: 根据接收到的 Action,更新状态并返回新的状态。
  • Selectors: 用于从状态中选择特定的数据。

在 Flutter 中使用 Redux 需要使用第三方库,如 flutter_redux,该库提供了用于连接 Flutter 应用和 Redux Store 的小部件。

四、GetX

GetX 是一个在 Flutter 中提供状态管理和依赖注入的强大工具包。它为开发者提供了一种简单、高效的方式来管理应用程序的状态和依赖关系。下面让我们详细讲解一下 GetX 的状态管理器部分。

  1. 状态管理:

在 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++;

  1. 状态更新:

使用 GetX 更新状态非常简单。你可以直接通过 .value 属性来更新可观察数据的值。GetX 会自动通知订阅了该数据的观察者。

final count = RxInt(0);

// 更新数据
count.value++; // 通知观察者数据变化
  1. 依赖注入:

GetX 也提供了依赖注入的功能,使得在应用中的不同部分共享实例变得容易。你可以使用 Get.put() 方法来注册实例,并且使用 Get.find() 来获取已注册的实例。

class MyController extends GetxController {
  // Your controller code
}

// 注册控制器实例
Get.put(MyController());

// 获取实例
MyController myController = Get.find<MyController>();
  1. GetBuilder 和 Obx:

GetBuilder: 这是一个小部件,它可以根据可观察数据的变化来重建部件树。你可以使用 GetBuilder 将小部件与可观察数据关联,使其在数据变化时自动重建。
Obx: 这是一个更轻量级的小部件,适用于只需要监听一个可观察数据的情况。你可以通过 Obx(() => YourWidget()) 的方式来实现。
5. 其他功能:

GetX 还提供了很多其他有用的功能,如路由管理、导航、国际化等,使得开发过程更加高效。你可以通过 Get.to() 和 Get.off() 等方法来进行页面导航,通过 Get.putAsync() 来异步注册依赖项等。


总结

无论选择哪种状态管理方式,都需要根据应用的规模、复杂性和开发团队的偏好来做出决定。这些状态管理模式的核心目标是有效地管理应用的状态,使代码结构清晰、易于维护,并提供良好的开发体验。

总体来说,GetX 是一个功能强大且易于学习的状态管理和依赖注入工具包,适用于各种规模和复杂度的 Flutter 应用程序。它的简洁语法和高性能使得开发者可以更专注于业务逻辑,而无需过多关注状态管理的细节。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习深度学习——seq2seq实现机器翻译(数据集处理)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——从编码器-解码器架构到seq2seq&#xff08;机器翻译&#xff09; &#x1f4da;订阅专栏&#xff1a;机…

三菱plc 工程的系统参数fCPu参数与 可编程控制器的系统参数/CPu参数不一致。

三菱plc 工程的系统参数fCPu参数与 可编程控制器的系 统参数/CPu参数不一致。

掌握Python的X篇_30_使用python解析网页HTML

本篇将会介绍beutifulsoup4模块&#xff0c;可以用于网络爬虫、解析HTML和XML&#xff0c;对于没有接触过前端&#xff0c;不了解HTML是如何工作的&#xff0c;需要先解释一下什么事HTML。 1. HTML 网页中的各种布局等的背后都是非常简单的纯文本格式&#xff0c;那种格式称为…

Android的学习系列之Android Studio Setup安装

Android的学习系列之Android Studio Setup安装 [TOC](Android的学习系列之Android Studio Setup安装) 前言Android平台搭建总结 前言 还是项目需要&#xff0c;暂时搭建安卓的运行平台。 Android平台搭建 安装包 双击安装包&#xff0c;进入安装。 下一步 根据自己需求&a…

(7)(7.1) 使用航点和事件规划任务

文章目录 前言 7.1.1 设置Home位置 7.1.2 视频&#xff1a;制作并保存多路点任务 7.1.3 视频&#xff1a;加载已保存的多航点任务 7.1.4 使用说明 7.1.5 提示 7.1.6 自动网格 7.1.7 任务指令 7.1.8 任务结束 7.1.9 任务重置 7.1.10 MIS_OPTIONS 7.1.11 任务再出发 …

客户跟进轻松搞定:推荐一款功能全面的客户跟进软件

阅读本文您可以了解&#xff1a;1、如何选择客户跟进软件&#xff1b;2、简单好用的客户跟进软件推荐 客户跟进是建立并维护良好客户关系的关键步骤。通过定期的跟进&#xff0c;可以及时了解客户的需求和反馈&#xff0c;解决问题&#xff0c;提供支持&#xff0c;从而增强客…

ubuntu18.04下配置muduoC++11环境

1.安装muduo依赖的编译工具及库 Cmake sudo apt-get install cmakeBoost sudo apt-get install libboost-dev libboost-test-devcurl、c-ares DNS、google protobuf sudo apt-get install libcurl4-openssl-dev libc-ares-dev sudo apt-get install protobuf-compiler libp…

你知道什么是Curriculum Training模型吗

随着深度学习技术的飞速发展&#xff0c;研究人员在不断探索新的训练方法和策略&#xff0c;以提高模型的性能和泛化能力。其中&#xff0c;Curriculum Training&#xff08;课程学习&#xff09;模型作为一种前沿的训练方法&#xff0c;引起了广泛的关注和研究。本文将深入探讨…

如何实现安全上网

l 场景描述 政府、军工、科研等涉密单位或企业往往要比其他组织更早接触高精尖的技术与产品&#xff0c;相对应的数据保密性要求更高。常规的内外网物理隔离手段&#xff0c;已经满足不了这些涉密单位的保密需求&#xff0c;发展到现在&#xff0c;需求已经演变成既要保证网络…

Python爱心光波

文章目录 前言Turtle入门简单案例入门函数 爱心光波程序设计程序分析 尾声 前言 七夕要来啦&#xff0c;博主在闲暇之余创作了一个爱心光波&#xff0c;感兴趣的小伙伴们快来看看吧&#xff01; Turtle入门 Turtle 是一个简单而直观的绘图工具&#xff0c;它可以帮助你通过简…

【linux】2 软件管理器yum和编辑器vim

目录 1. linux软件包管理器yum 1.1 什么是软件包 1.2 关于rzsz 1.3 注意事项 1.4 查看软件包 1.5 如何安装、卸载软件 1.6 centos 7设置成国内yum源 2. linux开发工具-Linux编辑器-vim使用 2.1 vim的基本概念 2.2 vim的基本操作 2.3 vim正常模式命令集 2.4 vim末行…

【Unity】VS Code 没有智能提示 Unity 中的类

正常来说&#xff0c;VS Code中会对部分输入类名进行提示&#xff0c;如下图所述 假如你从Unity 中进入 VS Code后发现没有提示相关 Unity的类&#xff0c;可能是 Unity 中 有关于 VS Code的相关Package 没有跟着 VS Code升级到最新版本。 点击Unity Windows 下拉框中的 Pac…

拒绝摆烂!C语言练习打卡第二天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4dd;…

DIP:《Deep Image Prior》经典文献阅读总结与实现

文章目录 Deep Image Prior1. 方法原理1.1 研究动机1.2 方法 2. 实验验证2.1 去噪2.2 超分辨率2.3 图像修复2.4 消融实验 3. 总结 Deep Image Prior 1. 方法原理 1.1 研究动机 动机 深度神经网络在图像复原和生成领域有非常好的表现一般归功于神经网络学习到了图像的先验信息…

分布式定时任务系列5:XXL-job中blockingQueue的应用

传送门 分布式定时任务系列1&#xff1a;XXL-job安装 分布式定时任务系列2&#xff1a;XXL-job使用 分布式定时任务系列3&#xff1a;任务执行引擎设计 分布式定时任务系列4&#xff1a;任务执行引擎设计续 Java并发编程实战1&#xff1a;java中的阻塞队列 引子 这篇文章的…

图片懒加载指令-vueUse

基于Vue的自定义钩子集合 https://vueuse.org/ 适用于Vue 3和Vue2.7版本之后 基于vueUse定义懒加载指令

【C语言】每日一题(多数元素)

多数元素&#xff0c;链接奉上 方法 1.摩尔投票2.合理但错误的方法2.1暴力循环2.2排序求出中间元素中间元素 1.摩尔投票 先来简单的介绍摩尔投票&#xff1a; 摩尔投票是一种用来解决绝对众数问题的算法。 什么是绝对众数呢&#xff1f; 在一个集合中&#xff0c;如果一个元素…

Linux MQTT智能家居项目(LED界面的布局设置)

文章目录 前言一、LED界面布局准备工作二、LED界面布局三、逻辑实现总结 前言 上篇文章我们完成了主界面的布局设置那么这篇文章我们就来完成各个界面的布局设置吧。 一、LED界面布局准备工作 首先添加LED灯光控制的图标。 将选择好的LED图标添加进来&#xff1a; 图标可以…

微信小程序实现当前页面更新上一个页面

日常项目中需要实现的一个价格脱敏功能&#xff1a;通过点击页面二中的查看完整信息 点击回退按钮实现页面一中的价格显露出来 通过查询了大量资料发现 大多数都是通过调用上一个接口的onload 或者onshow 实现视图更新 经测试后 发现 无法实现 只能更改数据 无法更新视图 实现…

服务器如何防止cc攻击

对于搭载网站运行的服务器来说&#xff0c;cc攻击应该并不陌生&#xff0c;特别是cc攻击的攻击门槛非常低&#xff0c;有个代理IP工具&#xff0c;有个cc攻击软件就可以轻易对任何网站发起攻击&#xff0c;那么服务器如何防止cc攻击?请看下面的介绍。 服务器如何防止cc攻击&a…