Flutter之GetX框架的使用

文章目录

    • 前言
    • GetX使用建议
    • 状态管理
    • GetX快速上手
    • GetX基本功能介绍
      • **核心作用**
      • **代码示例**
      • **关键细节**
      • **性能建议**
    • 参考链接

前言

在Reddit上,诟病GetX的声音很多,主要是说它做的事情太多,不是单一功能组件,违反单一职责原则。容易被滥用,容易产生意大利面式的代码等等。他们推荐riverpod。GetX上一次版本更新时2021年了。

它想做的太多了: 一个试图做所有事情的库,虽然方便,但并不能给你架构带来多少灵活性。如果GetX突然在你某个DI用例或路由用例中失败了,你就会突然遇到库膨胀的问题,这很容易导致工程师们用“各种风格”来写解决方案。最终导致意大利面代码和难以追踪的bug。

它偏离了Flutter的Context模型: 因为GetX的“定位器”是静态可用的,不依赖于BuildContext,所以它们本质上很脆弱,并且违背了Flutter最初的设计原则。像渲染生命周期这样的东西,并没有像Provider或Riverpod那样被遵守。

我用过provider、GetX和Riverpod,而且到目前为止,Riverpod是状态管理中最容易测试和最简单的方法。把它和Get结合起来,你就能得到你所需要的一切,我觉得。

Provider是一个轻量级的状态管理框架,它基于InheritedWidget和ChangeNotifier实现,提供了简单而强大的方式来共享状态,并支持依赖注入,非常适合小型应用和初学者。

Riverpod作为Provider的升级版,提供了更强大的功能和更好的性能,同时保持了简洁性和易用性。它使用全新的架构,具备出色的依赖管理和异步处理能力,适合中大型应用和有一定经验的开发者。

GetX则是一个快速、轻量级的状态管理和路由管理库,它提供了许多便利的功能,如依赖注入、路由管理、国际化、主题切换等。GetX的语法简洁且性能优秀,非常适合构建中小型应用,能够简化开发流程。

此外,Redux、MobX和BLoC也是Flutter中常见的状态管理框架。Redux通过单一的状态存储库管理状态,MobX基于响应式编程,而BLoC则基于Reactive Programming和Stream。

GetX使用建议

在某些地方,GetX 非常灵活(太灵活了),而且容易被误用。如果你没有好好考虑如何正确使用它,你会遇到很多问题。

这里有几条可以帮助你的规则:

  • 让你的模型和服务层独立于 GetX。如果你需要在那个部分进行依赖注入,使用其他库。

  • 只在表现层使用 GetX 的可观察对象和依赖管理(例如 Get.put, Get.find)。表现层是页面控制器和小部件。

  • 只在控制器中使用 GetX 的导航函数(例如 Get.to, Get.back)。避免在小部件中使用它们,尤其是在你的模型和服务层中。

  • GetX 包含很多快捷函数,比如 Get.height,不要使用它们,使用标准的 Flutter 等效函数。在这种情况下 MediaQuery.of(context).size.height

  • 尽量避免使用 GetX 的实用程序来显示对话框、提示条和底部弹出框。但如果你想使用它们,只能从控制器中调用它们。

  • 但是,你也有很大几率会遇到 GetX 路由的问题。它不够灵活,而且有点 bug。如果你想使用另一个路由器,你需要很好地理解 GetX 的工作原理。因为标准路由器管理控制器的生命周期。你需要用外部路由器实现类似的东西。

  • GetX 和 Riverpod 可以无缝混合使用,不会产生冲突。混合使用这两种框架的关键在于职责分离,让每个框架处理自己擅长的部分。通过 GetX 来处理 UI 层的状态和路由,同时使用 Riverpod 来管理复杂的全局状态或业务逻辑,可以充分发挥两者的优势。当你需要一个简洁的 UI 层管理方案并且同时需要处理复杂的状态逻辑时,混合使用这两者是一种不错的选择。

GetX 状态管理框架中,使用 Obx 包裹一个组件的主要作用是 自动监听响应式变量(Rx)的变化,并在变量值更新时自动重建该组件,从而实现高效的局部刷新,避免不必要的全局 build


状态管理

不用状态管理框架时,直接在Statefulwidget中定义状态类,里面持有所有数据,然后在事件处理中调用HTTP请求获取数据,在setState()刷新界面。但这种方式在跨组件共享状态时就不好处理了。于是有了几大状态管理框架。
在这里插入图片描述
再摆一个InheritedWidget的流程图吧:
在这里插入图片描述
InheritedWidget对子节点的Element,有个强大的操作功能:可以将子widget的element实例,储存在自身的InheritedElement中的_dependents变量中调用其notifyClients方法,会遍历_dependents中的子Element,然后调用子Element的markNeedsBuild方法,就完成了定点刷新子节点的操作。

GetX快速上手

  • 代码拆分为View, Controller和Http请求三大部分,当然还有model
  • Controller统一管理所有数据,负责Http交互
  • view只管渲染Rx数据,用Obx包裹需要刷新的小部件,注意粒度尽可能小
  • 有几个Http请求,就在controller中定义几个Future,通过FutureBuilder来触发Http请求,不要自己在initState()显示调用

GetX基本功能介绍

核心作用

  1. 自动订阅响应式变量

    • Obx 内部会监听其回调函数(() => Widget)中使用的所有 Rx 变量(如 RxIntRxStringRxList 等)。
    • 当这些变量发生变化时,Obx 会自动触发包裹的组件重建。
  2. 局部刷新,性能优化

    • 不同于 setState 会重建整个页面,Obx 只更新其包裹的组件,减少不必要的渲染开销。
  3. 简洁的语法

    • 无需手动管理订阅或取消订阅(相比 GetBuilderStreamBuilder,代码更简洁)。

代码示例

class CounterController extends GetxController {var count = 0.obs; // 声明响应式变量
}class MyPage extends StatelessWidget {final controller = Get.put(CounterController()); // 注入控制器Widget build(BuildContext context) {return Scaffold(body: Center(child: Obx(() => Text("Count: ${controller.count.value}"), // 自动监听 count 变化),),floatingActionButton: FloatingActionButton(onPressed: () => controller.count++, // 修改 count 会触发 Obx 更新child: Icon(Icons.add),),);}
}

关键细节

  1. 依赖的变量必须为 Rx 类型

    • Obx 仅对 .obs 创建的响应式变量生效(如 0.obs"hello".obs),普通变量无效。
  2. 作用域限制

    • Obx 只会监听其回调函数内部直接使用的 Rx 变量。例如:
      Obx(() => Text("${controller.count.value}")); // 有效
      // 错误!下面的写法不会监听 count:
      // var text = "Count: ${controller.count.value}";
      // Obx(() => Text(text));
      
  3. GetBuilder 的区别

    • Obx 适用于响应式变量(Rx),自动订阅变化。
    • GetBuilder 需要手动调用 update(),适合非响应式状态管理。

性能建议

  • 避免过度嵌套 Obx:每个 Obx 会独立订阅变量,嵌套过多可能影响性能。
  • 复杂场景使用 GetXGetBuilder:如果需要更精细的控制(如防抖、条件更新),可以考虑其他 GetX 工具。

通过 Obx,GetX 实现了类似 Flutter 原生 ValueListenableBuilderStreamBuilder 的功能,但代码更简洁且性能更优。

参考链接

  • get_it: 不是GetX,据说和riverpod搭配起来很好用

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

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

相关文章

Kettle数据抽取(二)

一、脚本运用 从本地ORACLE11 数据库 抽取数据到 华为MYSQL8.1 数据库 抽取前先删除MYSQL8.1 数据库中emp_dept_salgrade表原有数据,避免重复 二、插入表更新 事实上前面一种方法不是增量处理,因为是全部删除合部重新写入相当于初始化一样,这种情形,如果数据量较大,如有1…

一套高质量的博客平台、社交应用UI

这是一套移动端UI设计素材包含14个高质量PSD文件,涵盖博客社交类APP的核心页面,包括登录界面、动态展示、文章详情、聊天会话等常用场景。所有素材均为可编辑PSD格式,支持快速二次开发,适用于移动网站和APP项目。资源提供完整的UI…

麒麟信安支撑2025年电力监控系统安全运维新技能推广应用示范培训班顺利举办

近日,由国调中心主办、国网技术学院电网运行培训部承办的“2025年电力监控系统安全运维新技能推广应用示范培训班(第一期)”顺利举办。电网运行培训部高度重视本次培训组织工作,在国调中心的指导下,精心编制培训方案&a…

支付系统架构图

简明产品架构图 1. 商户门户 商户通过该门户管理与支付平台的所有互动,包括: 登录:商户进入系统,进行身份验证。 入驻:新商户注册并加入平台,开始使用支付服务。 订单管理:商户可以管理自己…

企业如何一键复制 DolphinScheduler 项目到新项目服务器?全套自动化方案来了!(企业不外传的实用工具)

在企业生产实践中,常见的一种场景是:一个大数据调度项目需要为多个客户分别部署在不同服务器上,而每个客户的任务逻辑、工作流结构、资源文件基本相同。这种情况下,如果每次都手动创建 DolphinScheduler 项目、上传资源文件、配置流程和参数,不仅浪费大量时间,还极容易出…

Oracle中10个索引优化

Oracle数据库作为一个功能强大的企业级数据库系统,对于索引的优化有着丰富的技巧和方法。理解和运用这些技巧可以显著提高数据库性能。 示例代码: – 假设我们有一个员工表 CREATE TABLE employees ( emp_id NUMBER PRIMARY KEY, name VARCHAR2(100), de…

【cv学习笔记】YOLO系列笔记

写在前面:本文主要介绍YOLO系列的整体框架,以及改进点的介绍。前面有型号的类型是经典,常被应用,YOLOv5,YOLOv8,和YOLOv11是ultralytics公司作品 *YOLOv5 Ultralytics YOLOv5 -Ultralytics YOLO 文档 YOL…

Ubuntu下搭建Black Magic Probe (BMP) 编译环境

版本和环境信息如下: PC平台: Windows 11 专业版 虚拟机运行平台:Oracle VM VirtualBox 7.1.6 Linux虚拟机: Ubuntu24.04 Debug调试器: BlackMagicProbe(BMP) 开源调试器:WeAct STM32F103CBT6 BluePill 核心…

Spring Cloud Gateway 动态路由实现方案

动态路由的核心需求:在不重启网关的情况下,实时修改路由规则。以下是 4 种实现方案: 方案 1:基于内存的动态路由(RefreshRoutesEvent) 适用场景:临时修改,重启失效 Autowired pri…

Flutter 路由守卫全面解析:从原理到实践

路由守卫是现代移动应用开发中不可或缺的重要机制,它如同应用的"安检系统",在页面跳转前进行必要的检查和拦截。本文将深入探讨 Flutter 中路由守卫的实现原理、多种实现方案以及实际应用场景,帮助开发者构建更安全、更可靠的 Flut…

mysql表备份数据,改表名

mysql表改表名 在MySQL中,直接更改表名并不是一个操作,因为MySQL不允许直接更改表的名称。但是,你可以通过创建一个新表,然后将旧表的数据复制到新表中,最后删除旧表的方式来实现更改表名的目的。这个过程通常被称为“…

开疆智能ModbusTCP转Canopen网关连接汇川AM403PLC与编码器配置案例

二、AM403作为Modbus四主站的配置过程 1.将AM403设为主站 AM403本体带一路EtherNET园囗(CN3),本例使用该网口作为ModbusTCP通讯口.如下图所示展开项目树,从设备树中找到网络组态(或者Network Configuration): 双击该节点标题打开网络组态设置界面&…

Charles里怎么进行断点调试

Charles进行断点测试的核心目的是通过主动拦截并篡改网络请求与响应数据,构建特定测试场景以验证系统健壮性和逻辑正确性,主要服务于以下关键场景: 🔧 一、验证后端逻辑健壮性 绕过前端校验 修改前端受限参数(如超长字符串、特殊字符),测试后端对异常输入的过滤与容错…

【3D插件推荐】PolyCloth v2.07 超强布料模拟工具(附图文安装教程与下载)

软件介绍 PolyCloth v2.07是一款专为3ds Max设计的布料模拟动画插件,由PolyDesign开发。该插件基于物理动力学模拟,能够为用户提供一个多线程和C的布料画笔工具,帮助用户轻松创建真实感极强的布料动画效果。无论是角色服装还是室内装饰&…

开源综合性网络安全检测和运维工具-TscanClient

开源综合性网络安全检测和运维工具-TscanClient 前言 在当今数字化的时代,网络安全问题日益凸显,企业和个人面临着各种各样的网络威胁。为了有效应对这些威胁,一款强大的网络安全检测和运维工具显得尤为重要。今天,我要给大家介…

MySQL 8.0 OCP 英文题库解析(十五)

Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题131~140 试题1…

WPF将容器内的组件按比例缩放

1.使用多值转换器,XAML中传入容器的当前宽高,和组件的原始宽高。 <Grid.Height><MultiBinding Converter="{StaticResource SetScaleConverter}"><Binding ElementName="MainWindow1" Path="ActualWidth"></Binding>…

开疆智能ModbusTCP转Devicenet网关连接ABB机器人配置案例

本案例是模拟ModbusTCP主站软件通过开疆智能ModbusTCP转Devicenet网关连接ABB机器人的配置案例&#xff0c;具体过程如下。 配置过程 ABB机器人IO板配置 1、简介 (ABB老版本IO板通讯配置为UNIT&#xff0c;新版本IO板通讯配置为DeviceNet device&#xff0c;此日记以新版本D…

Spring @Qualifier,@Primary

[Q&A] Qualifier 引入背景 在使用 Inject 或 Autowired 进行依赖注入时&#xff0c;默认是 按类型匹配 Bean 的&#xff0c;但如果容器中有多个相同类型的 Bean&#xff0c;Spring 就无法确定该注入哪一个&#xff0c;会抛出异常&#xff1a;NoUniqueBeanDefinitionExcept…

面试遇到的商城项目相关问题总结

今天面试遇到的商城项目相关问题总结 记录一下面试中被问到的和商城项目相关的高频问题和我的实际解答&#xff0c;希望能帮到也在准备前端面试的小伙伴&#xff01; 1. 商城首页、商品列表页怎么做性能优化&#xff1f; 主要从这几个方面展开&#xff1a; 1&#xff09;资…