当前位置: 首页 > news >正文

Flutter Getx状态管理

在 Flutter 开发中,状态管理是一个非常重要的话题。随着应用变得更加复杂,状态管理的方式也变得越来越多。Flutter 提供了多种状态管理的解决方案,如 ProviderRiverpodBLoC 等,而在这些选项中,GetX 作为一个轻量级、高效且易用的状态管理库,受到了很多开发者的青睐。

本文将介绍如何使用 GetX 进行状态管理,并通过一个实际的 Demo 演示如何在 Flutter 项目中实现响应式状态管理。

什么是 GetX?

GetX 是一个为 Flutter 提供的高效且轻量级的状态管理库。它不仅支持响应式状态管理,还提供了路由管理、依赖注入等功能。GetX 的优势在于其简单易用,性能非常高,而且代码量少。

GetX 的主要特点

  1. 简洁的 API:GetX 提供了简单且易于理解的 API,使用起来非常方便。
  2. 响应式编程:通过 Rx 类型的变量,实现自动监听和更新 UI。
  3. 性能优秀:相比于其他状态管理库,GetX 的性能更优秀,尤其是在响应式状态管理方面。
  4. 全局依赖注入:可以通过 GetX 方便地进行依赖注入,解耦各个部分。

如何使用 GetX 进行状态管理

1. 安装 GetX

首先,在你的 Flutter 项目的 pubspec.yaml 文件中添加 GetX 依赖:

dependencies:flutter:sdk: flutterget: ^4.6.5

然后运行 flutter pub get 来安装依赖。

2. 创建 Controller 类

在 GetX 中,通常会通过一个 Controller 类来管理状态。Controller 类是存放所有业务逻辑和状态的地方。你可以在其中定义响应式的变量和方法来更新这些变量。

示例:CounterController

创建一个简单的 CounterController 来管理计数器的状态:

两种写法:

1、如果是int String double bool等类型,可以直接用get自带的RXInt/RxString/RxDouble/RxBool

2、也可以用Rx<T>,这样就可以支持自定义类型了,更改值时需要加上.value

import 'package:get/get.dart';class CounterController extends GetxController {/*定义一个响应式的变量两种写法:1、如果是int String double bool等类型,可以直接用get自带的RXInt/RxString/RxDouble/RxBool2、也可以用Rx<T>,这样就可以支持自定义类型了,更改值时需要加上.value*/// RxInt count = 0.obs;Rx<int> count = 0.obs;// 定义一个方法来更新计数器void increment() {// count++;count.value++;}
}

在上面的代码中:

  • count 是一个响应式变量,使用了 .obs 来声明它是响应式的。每当 count 变化时,任何监听它的 UI 组件都会自动刷新。
  • increment() 方法用于增加 count 的值。

3. 在 UI 中使用 GetX

接下来,我们需要在 UI 中使用 GetX 来显示和更新 count

示例:使用 GetX 在界面中显示计数器
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'counter_controller.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return GetMaterialApp(home: CounterPage(),);}
}class CounterPage extends StatelessWidget {// 获取 Controller 实例final CounterController controller = Get.put(CounterController());@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("GetX State Management")),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [// 使用 GetX 监听响应式变量 count 的变化Obx(() => Text('Counter: ${controller.count}', // UI 会自动更新style: TextStyle(fontSize: 32),),),SizedBox(height: 20),ElevatedButton(onPressed: controller.increment, // 调用 increment 方法child: Text('Increment'),),],),),);}
}

在这个例子中:

  • 我们使用 Get.put(CounterController()) 来将 CounterController 注册到依赖注入容器中,这样我们就可以在整个应用中共享它。
  • 使用 Obx 小部件来监听 controller.count 变量的变化。当 count 更新时,Obx 会自动重新构建 UI。

4. 使用 GetBuilder 更新 UI

除了 ObxGetX 还提供了 GetBuilder 作为更新 UI 的另一种方式。GetBuilder 不依赖于响应式变量,而是通过显式的 update() 方法来触发 UI 更新。使用 GetBuilder 可以在需要时手动控制 UI 更新,适用于更复杂的场景。

创建controller类:

如果用GetBuilder刷新需要手动加上update方法,有点像setstate,只不过setState触发的是整个 build 方法的执行,而 update() 只会触发 GetBuilder 相关部分的重新构建。update() 提供了一种更精细的 UI 更新机制,适用于那些需要手动控制何时更新 UI 的场景,而不依赖自动响应式变量的场景。

import 'package:get/get.dart';class CounterController extends GetxController {//如果用GetBuilder就不用.obs了,正常类型就行int count = 0;void increment() {count++;update();}
}

示例:使用 GetBuilder 更新 UI

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'counter_controller.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return GetMaterialApp(home: CounterPage(),);}
}class CounterPage extends StatelessWidget {// 获取 Controller 实例final CounterController controller = Get.put(CounterController());@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("GetX with GetBuilder")),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [// 使用 GetBuilder 来手动更新 UIGetBuilder<CounterController>(builder: (_) {return Text('Counter: ${controller.count}', // UI 会通过控制器手动更新style: TextStyle(fontSize: 32),);},),SizedBox(height: 20),ElevatedButton(onPressed: controller.increment, // 调用 increment 方法child: Text('+++'),),],),),);}
}

在这个例子中:

  • GetBuilder<CounterController> 监听了 CounterController 类,并通过 builder 方法来构建 UI。当调用 controller.increment() 时,controller 会调用 update() 来手动触发 UI 更新。
  • GetBuilder 不会像 Obx 那样自动监听响应式变量,它依赖于 controller.update() 来手动触发 UI 更新。

5. 使用 GetX 更新多个变量

在实际开发中,我们可能需要更新多个响应式变量。GetX 允许你轻松地管理多个响应式变量,并且可以通过 update() 方法来通知 UI 更新。

示例:管理多个状态
import 'package:get/get.dart';class UserController extends GetxController {var name = 'John'.obs;var age = 25.obs;void updateName(String newName) {name.value = newName;}void incrementAge() {age++;}
}

在 UI 中监听并更新这两个变量:

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'user_controller.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return GetMaterialApp(home: UserPage(),);}
}class UserPage extends StatelessWidget {final UserController controller = Get.put(UserController());@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('User Info')),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [// 使用 Obx 来监听并显示多个响应式变量Obx(() => Text('Name: ${controller.name}\nAge: ${controller.age}',style: TextStyle(fontSize: 24),textAlign: TextAlign.center,),),SizedBox(height: 20),ElevatedButton(onPressed: () => controller.updateName('Alice'),child: Text('改名'),),ElevatedButton(onPressed: controller.incrementAge,child: Text('+++'),),],),),);}
}

6. 使用 Get.find 获取控制器实例

当多个页面需要共享同一个控制器实例时,你应该使用 Get.find 来查找控制器,而不是使用 Get.putGet.put用于将控制器放入依赖注入容器,并在页面加载时创建新的实例,而 Get.find 则是用于查找已有的控制器实例。

示例:在不同页面使用同一个 Controller

假设我们有两个页面需要共享同一个 CounterController 实例:

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'counter_controller.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return GetMaterialApp(home: FirstPage(),);}
}class FirstPage extends StatelessWidget {@overrideWidget build(BuildContext context) {final CounterController controller = Get.put(CounterController());return Scaffold(appBar: AppBar(title: Text("First Page")),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Obx(() => Text('Counter: ${controller.count}',style: TextStyle(fontSize: 32),),),ElevatedButton(onPressed: () => Get.to(SecondPage()),child: Text('Go to Second Page'),),],),),);}
}class SecondPage extends StatelessWidget {@overrideWidget build(BuildContext context) {// 使用 Get.find 获取共享的 Controller 实例final CounterController controller = Get.find();return Scaffold(appBar: AppBar(title: Text("Second Page")),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Obx(() => Text('Counter: ${controller.count}',style: TextStyle(fontSize: 32),),),ElevatedButton(onPressed: controller.increment,child: Text('Increment'),),],),),);}
}

总结

使用 Get.put 来创建和注册控制器,Obx用于响应式 UI 更新,而 GetBuilder 则用于手动控制 UI 更新。通过 Get.find 可以在多个页面中共享同一个控制器实例,从而确保应用状态的一致性。

通过 GetX,Flutter 开发变得更加简单和高效,尤其在处理复杂的应用状态时,它能轻松地管理和更新状态。

希望这篇博客对你了解 GetX 状态管理有所帮助!

相关文章:

Flutter Getx状态管理

在 Flutter 开发中&#xff0c;状态管理是一个非常重要的话题。随着应用变得更加复杂&#xff0c;状态管理的方式也变得越来越多。Flutter 提供了多种状态管理的解决方案&#xff0c;如 Provider、Riverpod、BLoC 等&#xff0c;而在这些选项中&#xff0c;GetX 作为一个轻量级…...

《成法》读书笔记

稻盛和夫的《成法》是一部关于个人和企业成功哲学的作品&#xff0c;结合了他在经营京瓷和KDDI&#xff0c;以及重建日航&#xff08;JAL&#xff09;过程中的经验和智慧。 以下是这本书的读书笔记&#xff0c;涵盖其核心思想和重要概念&#xff1a; 1. 以“心”为本 内容概…...

TensorFlow 2.0 环境配置

官方文档&#xff1a;CUDA Installation Guide for Windows 官方文档有坑&#xff0c;windows的安装指南直接复制了linux的指南内容&#xff1a;忽略这些离谱的信息即可。 可以从官方文档知悉&#xff0c;cuda依赖特定版本的C编译器。但是我懒得为了一个编译器就下载整个visua…...

Ekman理论回归

Scientific reportsEkman revisited: Surface currents to the left of the winds in the Northern HemisphereVagn Walfrid Ekman1905年的理论描述了地球旋转受到风的作用&#xff0c;摩擦边界层中的流场&#xff0c;北半球总是在海表风的右侧&#xff0c;南半球总是在海表风的…...

算法演练----24点游戏

给定4个整数&#xff0c;数字范围在1~13之间任意使用-*/&#xff08;&#xff09;&#xff0c;构造出一个表达式&#xff0c;使得最终结果为24&#xff0c; 方法一 算法分析&#xff1a;加括号和取出重复表达式 # 导入精确除法模块&#xff0c;使得在Python2中除法运算的行为更…...

【学习心得】Python好库推荐——tiktoken

一、tiktoken是什么&#xff1f; tiktoken是一个快速BPE分词器&#xff0c;是由 OpenAI 开发的一个用于文本处理的 Python 库&#xff0c;主要用于将文本编码为数字序列&#xff08;称为 "tokens"&#xff09;&#xff0c;或将数字序列解码为文本。这一过程被称为 &q…...

MacBook不额外安装软件,怎样投屏到安卓手机上?

提起iPhone或MacBook的投屏&#xff0c;人们总会想到airplay功能。但离开了苹果生态&#xff0c;其他品牌的手机电脑就未必配备airplay功能了。 如果想要将MacBook的电脑屏幕共享到安卓手机或平板上&#xff0c;到底要怎样做&#xff1f;需要安装什么软件吗&#xff1f; 不需要…...

flink sql + kafka + mysql 如何构建实时数仓

构建一个基于 Flink SQL、Kafka 和 MySQL 的实时数据仓库(Data Warehouse)架构,可以通过流处理的方式实现高效、实时的数据集成与分析。以下是如何利用这三者构建实时数仓的步骤与实现: 架构概述 Kafka:作为流数据平台,负责接收和传输来自不同源系统(如应用日志、传感器…...

Go语言开发基于SQLite数据库实现用户表查询详情接口(三)

背景 上一章 Go语言开发基于SQLite数据库实现用户表新增接口(二) 这一章我们实现用户表的查询详情接口 代码实现 mapper层 type UserMapper interface {GetById(id uint64) (*model.User, error)}type userMapper struct { }func (m *userMapper) GetById(id uint64) (*mod…...

(11)(2.1.7) FETtec OneWire ESCs(二)

文章目录 前言 3 组态 4 可选功能 5 SITL模拟 6 故障排除 前言 &#xff01;Note 此功能在固件版本4.1.1及更高版本上可用。 3 组态 FTW掩码 SERVO_FTW_MASK 参数选择将哪些伺服输出&#xff08;如果有的话&#xff09;路由到 FETtec ESC。更改此参数后需要重新启动。…...

Springboot maven常见依赖、配置文件笔记

pom.xml文件 一、<parent> 在Maven项目中&#xff0c;pom.xml 文件中的 <parent> 元素用于定义父项目的坐标。使用 <parent> 可以实现继承机制&#xff0c;子项目可以从父项目继承配置信息&#xff0c;比如依赖管理、插件配置等。这样可以避免在多个子项目…...

Ceph后端两种存储引擎介绍

Ceph是一个可靠的、自治的、可扩展的分布式存储系统&#xff0c;它支持文件系统存储、块存储、对象存储三种不同类型的存储&#xff0c;以满足多样存储的需求。在Ceph的存储架构中&#xff0c;FileStore和BlueStore是两种重要的后端存储引擎&#xff0c;下面将分别进行详细介绍…...

C++入门基础知识140—【关于C++ 类构造函数 析构函数】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 类构造函数 & 析构函数的相关内容…...

基于标签相关性的多标签学习

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

macOS系统下使用SQLark连接达梦数据库

目录 下载 SQLark 客户端 安装 SQLark 客户端 SQLark用户界面 使用SQLark连接达梦数据库 1. 选择达梦数据库 2. 输入连接信息 3. 测试连接 4. 创建连接 5. 验证连接成功 作为一名数据库开发者&#xff0c;在macOS系统上找到一款支持达梦数据库的数据库开发和管理工具&…...

爬虫如何解决短效代理被封的问题?

在数据采集的征途上&#xff0c;短效代理如同一把双刃剑&#xff0c;它既能为我们带来速度和效率&#xff0c;也可能因为频繁更换IP地址而遭遇被封禁的风险。那么&#xff0c;作为数据采集er的我们&#xff0c;该如何巧妙应对&#xff0c;确保爬虫的稳定运行呢&#xff1f;今天…...

Jmeter基础篇(22)服务器性能监测工具Nmon的使用

一、前言 我们在日常做压测的过程中&#xff0c;不仅仅需要监控TPS&#xff0c;响应时间&#xff0c;报错率等这些系统基础性能数据&#xff0c;还需要对服务器的性能&#xff08;如CPU、磁盘、内存、网络IO等&#xff09;做监控&#xff0c;以求对系统运行过程中的硬件性能有…...

Spring Boot 集成 RabbitMQ:消息生产与消费详解

在现代微服务架构中&#xff0c;消息队列扮演着至关重要的角色&#xff0c;RabbitMQ 是其中一种广泛使用的消息中间件。本文将详细介绍如何在 Spring Boot 项目中集成 RabbitMQ&#xff0c;实现消息的生产和消费&#xff0c;并提供相应的代码示例。 一、环境准备与依赖配置 首…...

JSON-RPC-CXX深度解析:C++中的远程调用利器

一、引言 1. JSON-RPC 简介及其在 C 开发中的重要性 JSON-RPC&#xff08;JavaScript Object Notation - Remote Procedure Call&#xff09;是一种基于 JSON 格式的远程过程调用协议。在 C 开发中&#xff0c;它扮演着至关重要的角色。随着软件系统的日益复杂和分布式架构的…...

【后端速成Vue】模拟实现翻译功能

前言&#xff1a; 本期将会介绍 Vue 中的 watch 侦听器&#xff0c;它语法是怎么样的呢&#xff1f;具有怎样的功能呢&#xff1f;最后用模拟实现百度翻译来更进一步练习 watch 侦听器 篮球哥找工作专属IT岗位内部推荐&#xff1a; 专属内推链接&#xff1a;内推通道 1、认识翻…...

QMCDecode:让音乐自由播放的开源格式转换工具

QMCDecode&#xff1a;让音乐自由播放的开源格式转换工具 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默认转换结果存…...

LFM2.5-1.2B-Thinking-GGUF算法解析应用:图解经典算法与复杂度分析

LFM2.5-1.2B-Thinking-GGUF算法解析应用&#xff1a;图解经典算法与复杂度分析 1. 算法可视化教学新范式 算法学习一直是计算机科学教育中的难点。传统的教科书讲解方式往往让初学者感到抽象难懂&#xff0c;而LFM2.5-1.2B-Thinking-GGUF模型为算法教学带来了全新的可视化解决…...

5分钟解锁跨平台微信:Docker容器化方案全攻略

5分钟解锁跨平台微信&#xff1a;Docker容器化方案全攻略 【免费下载链接】docker-wechat 在docker里运行wechat&#xff0c;可以通过web或者VNC访问wechat 项目地址: https://gitcode.com/gh_mirrors/docke/docker-wechat 还在为Linux系统无法使用微信而烦恼吗&#xf…...

Aurix/Tricore实验解析:从链接脚本到汇编指令的Trap向量表构建

1. 理解Trap机制与向量表基础 在Aurix/Tricore架构中&#xff0c;Trap&#xff08;陷阱&#xff09;是处理器响应异常事件的硬件机制&#xff0c;相当于汽车的安全气囊——平时看不见&#xff0c;但遇到碰撞时会立即触发保护。与中断不同&#xff0c;Trap是同步触发的&#xff…...

ROS Noetic下用Python脚本在Gazebo里动态生成障碍物(附完整代码和常见报错解决)

ROS Noetic下Python脚本动态生成Gazebo障碍物的工程实践 在机器人仿真测试中&#xff0c;动态生成环境障碍物是验证导航算法鲁棒性的关键手段。传统手动拖拽方式效率低下且难以复现特定测试场景&#xff0c;而通过编程控制Gazebo仿真环境则能实现测试流程的自动化与标准化。本文…...

GLM-OCR服务监控与运维指南:使用Prometheus与Grafana搭建看板

GLM-OCR服务监控与运维指南&#xff1a;使用Prometheus与Grafana搭建看板 想象一下&#xff0c;你负责的GLM-OCR服务正在线上稳定运行&#xff0c;突然接到业务方反馈&#xff0c;说图片识别接口响应变慢了。你第一反应是什么&#xff1f;是登录服务器看日志&#xff0c;还是去…...

Marp CLI元数据管理:如何优化SEO和社交媒体分享

Marp CLI元数据管理&#xff1a;如何优化SEO和社交媒体分享 【免费下载链接】marp-cli A CLI interface for Marp and Marpit based converters 项目地址: https://gitcode.com/gh_mirrors/ma/marp-cli Marp CLI是一款强大的命令行工具&#xff0c;让你仅用纯Markdown就…...

Optick多线程性能分析:游戏引擎中的并发性能优化实战

Optick多线程性能分析&#xff1a;游戏引擎中的并发性能优化实战 【免费下载链接】optick C Profiler For Games 项目地址: https://gitcode.com/gh_mirrors/op/optick Optick是一款专为游戏开发打造的C性能分析工具&#xff0c;能够精准捕捉多线程应用中的性能瓶颈&…...

PyTorch 3.0静训性能断崖预警:当AllReduce延迟>8.3ms或图编译耗时>117s时,你的训练任务已在 silently fail——附实时诊断CLI工具

第一章&#xff1a;PyTorch 3.0静态图分布式训练的静默失效危机全景PyTorch 3.0 引入的 TorchScript 静态图编译机制与 torch.distributed 的深度耦合&#xff0c;在多节点多卡场景下暴露出一类高危静默失效现象&#xff1a;训练进程持续运行、梯度同步无报错、loss 曲线看似收…...

Android USB串口通信终极指南:智能家居物联网项目实战

Android USB串口通信终极指南&#xff1a;智能家居物联网项目实战 【免费下载链接】usb-serial-for-android Android USB host serial driver library for CDC, FTDI, Arduino and other devices. 项目地址: https://gitcode.com/gh_mirrors/us/usb-serial-for-android …...