高效Flutter应用开发:GetX状态管理实战技巧

探索GetX状态管理的使用

前言

在之前的文章中,我们详细介绍了 Flutter 应用中的状态管理,setStateProvider库以及Bloc的使用。

本篇我们继续介绍另一个实现状态管理的方式:GetX


一、GetX状态管理

基础介绍

GetX 是一个在 Flutter 中提供状态管理和依赖注入的强大工具包。

它为开发者提供了一种简单、高效的方式来管理应用程序的状态和依赖关系。

GetX 使用 Rx 类来表示可观察的数据,当数据发生变化时,会自动通知订阅了该数据的观察者。

缺优点

1.优点:

(1)功能强大:集成了状态管理、路由管理、主题管理、国际化多语言管理、网络请求、数据验证等多种功能,几乎覆盖了应用开发中的大部分基础需求。
(2)简单易用:提供了简单直观的API,降低了学习成本。
(3)高性能:专注于性能和最小资源消耗,适用于各种规模和复杂度的应用。
(4)便捷路由管理:由管理不依赖于上下文,使得页面跳转更加灵活,同时也增强了代码的可维护性。

2.缺点

(1)生态系统依赖性:GetX 是一个第三方库,其未来发展可能受到 Flutter 框架和社区的影响。
(2)功能过剩:对于只需要简单状态管理的应用来说,GetX 可能提供了过多的功能。
(3)对应用的侵入性较强: 使用 GetX 的导航需要使用 GetMaterialAppGetCupertinoApp 包裹应用,这在某些情况下可能增加了对应用的侵入性。

二、GetX的使用

引入库

dependencies:flutter:sdk: flutterget: ^4.6.6

状态管理

GetX 的状态管理是其核心功能之一,它提供了一种简单而高效的方式来管理 Flutter 应用中的状态。

GetX 的状态管理主要依赖于 Rx(响应式变量)和 GetxController(控制器)

依赖注入

1.定义可注入的类:这些类通常是控制器或服务,它们包含应用的业务逻辑或状态。

2.注册依赖:在应用的某个初始化阶段,将需要被注入的类注册到 GetX 的依赖容器中。这可以通过 Get.put() 或在 GetMaterialAppbindings 数组中完成。

3.注入依赖:在需要这些依赖的组件中,通过 Get.find<T>() 方法获取它们的实例。但是,在 GetX 中,更常见的做法是使用 Get.to()Get.toNamed() 导航到页面时,通过路由参数自动注入控制器。

使用

(1)定义控制器

// counter_controller.dart  
import 'package:get/get.dart';  class CounterController extends GetxController {  var count = 0.obs; // 使用.obs将变量转换为可观察对象  void increment() {  count++;  }  
}

(2)注册依赖

在入口文件使用GetMaterialApp包裹,并使用 GetMaterialAppbindings 参数来注册定义好的控制器。

// main.dart  
import 'package:flutter/material.dart';  
import 'package:get/get.dart';  
import 'counter_controller.dart';  void main() {  runApp(MyApp());  
}  class MyApp extends StatelessWidget {    Widget build(BuildContext context) {  return GetMaterialApp(  title: 'Flutter Demo',  theme: ThemeData(  primarySwatch: Colors.blue,  ),  initialRoute: '/',  getPages: [  GetPage(name: '/', page: () => HomePage(), binding: BindingsBuilder(() {  Get.put(CounterController()); // 在这里注册控制器  })),  ],  );  }  
}

注意:在上面的示例中,我使用了 getPagesGetPage,这是 GetX 5.x 版本中引入的新路由管理方式。

如果你使用的是旧版本的 GetX,你可能需要使用 home 属性和 initialBinding

然而,对于简单的应用或当你不希望将控制器与特定路由绑定时,你可以直接在需要的地方使用 Get.put()Get.find<>()

(3)在页面中使用控制器

常用的状态管理器: GetBuilderObx

GetBuilder 相比 Obx , GetBuilder 是手动的状态管理器,需要更改的时候主动需要调用 update()

因为 GetBuilder 是手动的状态管理器,所以相比 Obx,内部没有维护 StreamSubscription ,内存消耗就会少

Obx 实现了自动响应数据变化,使用的时候用 Obx 包裹需要自动响应数据的 ui

如果你已经通过路由参数或全局方式注册了控制器,你可以在页面中使用 Get.find<CounterController>() 来获取它。

在ui中使用状态管理控制器:

第一种:使用 GetViewGetWidget(对于无状态组件)来自动注入控制器:

// home_page.dart  
import 'package:flutter/material.dart';
import 'package:get/get.dart';import 'counter_controller.dart';class HomePage extends GetView<CounterController> {// 继承自 GetView 并指定控制器类型Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Home Page'),),body: Obx(() => Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text('Count: ${controller.count}'),ElevatedButton(onPressed: controller.increment,child: Text('Increment'),),],),)),);}
}

在这个例子中,HomePage 继承自 GetView<CounterController>,这使得它可以直接通过 this.controller 访问 CounterController 的实例,而无需调用 Get.find<>()

这是 GetX 依赖注入系统的一个非常方便的特性。

第二种:使用 Get.put() 或者使用 Get.find<>()(前面已注册过该控制器了)直接注入依赖(有状态或无状态组件均可使用):

例子1:通过 Obx 实现了自动响应数据变化

// counter_controller.dart  
import 'package:flutter/material.dart';
import 'package:get/get.dart';import 'counter_controller.dart';class HomePage extends StatelessWidget {final controller = Get.put(CounterController());Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Home Page'),),body: Obx(() => Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text('Count: ${controller.count}'),ElevatedButton(onPressed: controller.increment,child: Text('Increment'),),],),)),);}
}

例子2:通过 GetBuilder手动响应数据变化

// counter_controller.dart  
Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Home Page'),),body: GetBuilder<CounterController>(builder: (lic) => Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text('Count: ${controller.count}'),ElevatedButton(onPressed: controller.increment,child: Text('Increment'),),],),),),);}
class CounterController extends GetxController {var count = 0.obs; // 使用.obs将变量转换为可观察对象void increment() {count++;update(); // 更改的时候主动需要调用update()}
}

提示:响应数组和对象数据变化时通常使用GetBuilder手动响应

上述代码的运行结果如下:

总结

GetX 状态管理是 Flutter 开发中一个非常有用的工具,它通过简洁的语法、强大的功能和高效的性能为开发者提供了构建现代应用程序的坚实基础。

GetX 还有很多非常有用且强大的功能,是一个值得学习和使用的框架。

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

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

相关文章

Ubuntu 20.04/22.04无法连接网络(网络图标丢失、找不到网卡)的解决方案

问题复述&#xff1a; Ubuntu 20.04无法连接到网络&#xff0c;网络连接图标丢失&#xff0c;网络设置中无网络设置选项。 解决方案 对于Ubuntu 20.04而言&#xff1a;逐条执行 sudo service network-manager stopsudo rm /var/lib/NetworkManager/NetworkManager.statesudo…

C# 使用Socket通信,新建WinForm服务端、客户端程序

一、新建WinForm Socket服务端程序 注&#xff1a;rtbReceviceMsg为RichTextBox控件 服务端程序、界面 服务端代码 public partial class Form1 : Form {public Form1(){InitializeComponent();}public virtual void TriggerOnUpdateUI(string message){if (this.InvokeRequir…

【SQL笔试题】SN_1 连续登陆系列问题

简介 连续登陆天数场景描述是对一个特定情境或活动连续发生的天数进行详细的阐述。这种描述通常用于展示某个事件或活动的持续时间&#xff0c;以及它对参与者或环境产生的影响。 常见的应用场景&#xff1a; 用户留存分析&#xff1a;通过跟踪用户的连续登录天数&#xff0…

240908-Linux通过ln设置软链接关联大模型文件

在Linux中&#xff0c;您可以使用ln命令来创建软链接&#xff08;符号链接&#xff09;。软链接是一种特殊类型的文件&#xff0c;它指向另一个文件或目录。以下是如何设置软链接的步骤&#xff1a; 创建软链接 基本语法&#xff1a; ln -s [目标文件或目录] [软链接的名称]示…

轮询解决方案

概述 轮询的使用场景&#xff1a; 股票 K 线图聊天重要通知&#xff0c;实时预警 这些场景都是都要实时性的。 http 是请求响应模式&#xff0c;一定需要先请求&#xff0c;后响应。 解决方案&#xff1a; 短轮询&#xff1a;interval 定时发送请求。问题&#xff1a;大量…

如何使用Python创建目录或文件路径列表

在 Python 中&#xff0c;创建目录或生成文件路径列表通常涉及使用 os、os.path 或 pathlib 模块。下面是一些常见的任务和方法&#xff0c;用于在 Python 中创建目录或获取文件路径列表。 问题背景 在初始阶段的 Python 学习过程中&#xff0c;可能遇到这样的问题&#xff1a…

基于Boost库的搜索引擎开发实践

目录 1.项目相关背景2.宏观原理3.相关技术栈和环境4.正排、倒排索引原理5.去标签和数据清洗模块parser5.1.认识标签5.2.准备数据源5.3.编写数据清洗代码parser5.3.1.编写读取文件Readfile5.3.2.编写分析文件Anafile5.3.2.编写保存清洗后数据SaveHtml5.3.2.测试parser 6.编写索引…

无人机动力系统设计之电调芯片参数选型

无人机动力系统设计之电调芯片参数选型 1. 源由2. 关键因素2.1 电压范围2.2 电流处理能力2.3 控制方式2.4 PWM输出与分辨率2.5 通讯接口2.6 保护功能2.7 支持霍尔传感器与无传感器模式2.8 集成度与外围器件2.9 效率与散热2.10 市场供应与成本 3. 因素阐述3.1 PWM工作频率3.1.1 …

Seata

TC - 事务协调者 维护全局和分支事务的状态&#xff0c;驱动全局事务提交或回滚。 TM - 事务管理器 定义全局事务的范围&#xff1a;开启全局事务、提交或回滚全局事务。 RM - 资源管理器 管理分支事务处理的资源&#xff0c;向 TC 注册分支事务&#xff0c;报告分支事务的…

Chainlit集成LlamaIndex并使用通义千问模型实现AI知识库检索网页对话应用

前言 之前使用Chainlit集成Langchain并使用通义千问大语言模型的API接口&#xff0c;实现一个基于文档文档的网页对话应用。 可以点击我的上一篇文章《Chainlit集成Langchain并使用通义千问和智谱AI实现AI知识库检索网页对话应用》 查看。 本次将Langchain框架更改为LlamaInde…

Hive任务优化参数整理

Hive本身是个基于hdfs的结构化数据管理工具&#xff0c;虽然在后面的发展中允许底层接入其他的数据源&#xff0c;比如第三方数据服务这种基础架构&#xff0c;但是它从立意上来说&#xff0c;它不适合用来做高性能查询引擎&#xff0c;反而在传统离线数据仓库中它有着自身的优…

使用 Elastic 和 LM Studio 的 Herding Llama 3.1

作者&#xff1a;来自 Elastic Charles Davison, Julian Khalifa 最新的 LM Studio 0.3 更新使 Elastic 的安全 AI Assistant 能够更轻松、更快速地与 LM Studio 托管模型一起运行。在这篇博客中&#xff0c;Elastic 和 LM Studio 团队将向你展示如何在几分钟内开始使用。如果你…

校园生活点餐外卖配送到宿舍小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 随着移动互联网的普及和校园生活的多元化&#xff0c;学生们对于线上点餐、外卖配送等服务的依赖度越来越高。然而&#xff0c;传统的校园餐饮服务模式往往存在效率低下、覆盖范围有限、信息不透明等问题&#xff0c;难以满足学生多样化的需求。因此&#xff0c;开发…

30万月变现3-6万,你也可以

30万月变现3-6万&#xff0c;你也可以 我相信&#xff0c;这些年我的IP还是吸引了不少的中产阶级关注我&#xff0c;什么叫中产阶级&#xff0c;就是兜里还是能随便掏出大几十大几百万的现金的&#xff0c;这群人&#xff0c;有着自己稳定的职业和收入来源&#xff0c;生活水平…

实例讲解电动汽车换挡控制策略及Simulink模型搭建方法

轻型电动汽车一般采用直驱的方式作为驱动方式&#xff0c;即不经过变速箱进行速比的调节&#xff0c;电机输出轴直接经过主减速器将动力传输至车轮。换挡器的换挡方式一般为VCU接收档位器的换挡请求后&#xff0c;根据整车当前状态判断换挡状态&#xff0c;最后输出当前档位状态…

已经30岁了,想转行从头开始现实吗?什么样的工作算好工作?

我是29岁那年&#xff0c;完成从转行裸辞副业的职业转型。 如果你把职业生涯看成是从现在开始30岁&#xff0c;到你退休那年&#xff0c;中间这么漫长的30年&#xff0c;那么30岁转行完全来得及&#xff1b; 如果你觉得必须在什么年纪&#xff0c;什么时间内必须完成赚到几十…

拯救手残党,一键转换季节天气变化效果图!

一键可转换四季或多种天气效果图 AI现在已经发展到这种程度了吗&#xff1f; 神采PromeAI也是卷起来了 以往通过【草图渲染】功能 就生成转化各种效果图 但这对用户来说还不够 又给大家上线了「场景转换器」功能 一键就能生成想要的各种时节场景的变化 一张效果图可以给…

机器学习之实战篇——MNIST手写数字0~9识别(全连接神经网络模型)

机器学习之实战篇——Mnist手写数字0~9识别&#xff08;全连接神经网络模型&#xff09; 文章传送MNIST数据集介绍&#xff1a;实验过程实验环境导入模块导入MNIST数据集创建神经网络模型进行训练&#xff0c;测试&#xff0c;评估模型优化 文章传送 机器学习之监督学习&#…

Qt绘制动态仪表(模仿汽车仪表指针、故障灯)

背景&#xff1a; 项目需要&#xff0c;可能需要做一些仪表显示。此篇除了介绍实现方法&#xff0c;还要说明心路历程。对我而言&#xff0c;重要的是心理&#xff0c;而不是技术。写下来也是自勉。 本人起初心里是比较抵触的&#xff0c;从业20多年了&#xff0c;深知所谓界…

springboot Web基础开发

Spring Boot 是一个用于简化 Spring 应用开发的框架&#xff0c;它通过自动配置和开箱即用的功能&#xff0c;使得创建和部署 Spring 应用变得更为高效。以下是 Spring Boot 基础 Web 开发的一些关键点和实操总结&#xff1a; 1. 项目搭建 使用 Spring Initializr: 访问 Spring…