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

GetX例子:在一个组件里更新状态,在另一个组件里获取更新的数据

下面是一个完整的 GetX 示例,演示如何在一个组件中更新状态,并在另一个组件中获取更新后的数据。我们将使用 GetX 的状态管理工具(GetxController + Obx/GetBuilder)。


1. 定义 Controller

首先,创建一个 GetxController 来管理状态。

counter_controller.dart
import 'package:get/get.dart';class CounterController extends GetxController {// 使用 Rx 包裹的响应式变量RxInt count = 0.obs;// 更新状态的方法void increment() {count.value++;}
}

2. 在 WidgetA 中更新状态

创建一个按钮组件,点击时调用 increment() 更新状态。

widget_a.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'counter_controller.dart';class WidgetA extends StatelessWidget {final CounterController controller = Get.put(CounterController());WidgetA({super.key});Widget build(BuildContext context) {return ElevatedButton(onPressed: () {// 调用 Controller 的方法更新状态controller.increment();},child: const Text('Increment Counter'),);}
}

3. 在 WidgetB 中获取状态

另一个组件监听 count 的变化,并实时显示最新值。这里提供两种方式:

方式 1:使用 Obx(响应式更新)
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'counter_controller.dart';class WidgetB extends StatelessWidget {WidgetB({super.key});Widget build(BuildContext context) {final CounterController controller = Get.find<CounterController>();return Obx(() => Text('Current Count: ${controller.count.value}',style: Theme.of(context).textTheme.headlineMedium,),);}
}
方式 2:使用 GetBuilder(局部更新)
class WidgetB extends StatelessWidget {WidgetB({super.key});Widget build(BuildContext context) {return GetBuilder<CounterController>(builder: (controller) {return Text('Current Count: ${controller.count.value}',style: Theme.of(context).textTheme.headlineMedium,);},);}
}

4. 整合到主页面

将两个组件放在同一个页面中测试。

main.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'widget_a.dart';
import 'widget_b.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return GetMaterialApp( // 注意:必须用 GetMaterialApphome: Scaffold(appBar: AppBar(title: const Text('GetX Example')),body: const Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [WidgetB(), // 显示状态SizedBox(height: 20),WidgetA(), // 更新状态],),),),);}
}

效果

  • 点击 WidgetA 的按钮时,CounterController 中的 count 会递增。
  • WidgetB 会自动刷新并显示最新的计数器值。

关键点说明

  1. Get.put() vs Get.find()

    • Get.put():注册 Controller(通常在首次使用时调用)。
    • Get.find():获取已注册的 Controller(无需重复创建)。
  2. 响应式 vs 非响应式

    • Obx:监听 .obs 变量,变化时自动刷新(需配合 Rx 类型)。
    • GetBuilder:手动调用 update() 时刷新(适合非响应式变量)。
  3. GetMaterialApp

    • 必须使用 GetMaterialApp 替代 MaterialApp,这是 GetX 的根上下文。

补充:如何手动触发更新?

如果在 CounterController 中不使用 .obs,可以通过 update() 方法通知界面刷新:

class CounterController extends GetxController {int count = 0;void increment() {count++;update(); // 通知 GetBuilder 刷新}
}

此时 WidgetB 必须使用 GetBuilder 才能生效。


通过这个例子,你可以清晰看到 GetX 的状态更新跨组件共享状态的流程。GetX 的语法更简洁,适合中小型项目快速开发。

http://www.xdnf.cn/news/13932.html

相关文章:

  • [Linux] -- 大文件拆分、合并与校验全解析:处理 GB/TB 级文件
  • 2024 一带一路暨金砖国家职业技能大赛(金砖国家未来技能和技术挑战赛)
  • openEuler虚拟机中容器化部署
  • c++虚表的调用
  • CSS 基础选择器、文字控制属性
  • 蓝牙协议GAP(Generic Access Profile)
  • 报表工具顶尖对决系列 — Echarts 展现与导出
  • CC工具箱使用指南:【断线连接】
  • Oracle OCP认证考试考点详解083系列18
  • 如何在SOLIDWORKS工程图中添加材料明细表?
  • 关于联咏(Novatek )自动曝光中Lv值的计算方式实现猜想
  • win11系统安装jdk11教程
  • day22
  • Python 实现一个带进度条的 URL 批量下载工具(含 GUI 界面)
  • 第三节 类型系统进阶-接口(interface)与类型别名(type)的区别
  • 算法导论第三章:数据结构艺术与高效实现
  • 【Mysql及各种关系型数据库全面对比与深度解析(2025版)】
  • 第六章网络互联设备
  • 前端八股文 - CSS 篇
  • GPU-CPU-FPGA三维异构计算统一内存架构实践:基于OpenCL的跨设备Kernel动态迁移方案(附内存一致性协议设计)
  • 深入剖析 Spring @Bean 注解:灵活定义与掌控你的 Bean
  • 权限管理设计思路
  • 土地利用遥感解译 ➕ CLUE未来预测 | 技术流分享!
  • STM32 Bootloader:使用文件头加载并启动应用程序
  • 2.监控领域中行业黑话知识学习指南
  • 基于深度学习的智能文本生成:从模型到应用
  • Vue3 Router 使用指南:从基础到高级用法
  • NVIDIA Container Toolkit 报错 Failed to initialize NVML: Unknown Error 的解决
  • Java8新特性 consumer
  • 访客预约到访填写表单如何制作?