Flutter Getx 简单的状态管理(依赖管理) GetxController
Getx 依赖管理简介
Get有一个简单而强大的依赖管理器,它允许你只用1行代码就能检索到与你的Bloc或Controller相同的
类,无需Provider context,无需inheritedWidget。
Controller controller = Get.put(Controller()); // 而不是 Controller controller = Controller();
想象一下,你已经浏览了无数条路由,现在你需要拿到一个被遗留在控制器中的数据,那你需要一个状
态管理器与Provider或Get_it一起使用来拿到它,对吗?用Get则不然,Get会自动为你的控制器找到你
想要的数据,而你甚至不需要任何额外的依赖关系。
Controller controller = Get.find(); //是的,它看起来像魔术,Get会找到你的控制器,并将其提供给你。你可以实例化100万个控制器,Get总 会给你正确的控制器。
多页面之间的数据共享
Flutter默认创建的 "计数器 "项目有100多行(含注释),为了展示Get的强大功能,我将使用 GetX 重
写一个"计数器 Plus版",实现:
- 每次点击都能改变状态
- 在不同页面之间切换
- 在不同页面之间共享状态
- 将业务逻辑与界面分离
应用程序入口设置
import 'package:flutter/material.dart'; import 'package:get/get.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); // This widget is the root of your application. @override Widget build(BuildContext context) { return GetMaterialApp(); ... } }
新建CountController
import 'package:get/get.dart'; class CountController extends GetxController { RxInt count = 0.obs; // 初始化一个可观察的变量count,初始值为0 void inc() { count++; // 递增count的值 update(); // 通知侦听器进行更新 } void dec() { count--; // 递减count的值 update(); // 通知侦听器进行更新 } }
TimePag.dart执行inc方法
import 'package:app_flutter01/pages/Key/messages.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; class TimePag extends StatefulWidget { const TimePag({super.key}); @override State<TimePag> createState() => _TimePagState(); } class _TimePagState extends State<TimePag> { CountController countController = Get.put(CountController()); //实例化控制器 @override Widget build(BuildContext context) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Obx(() => Text("${countController.count}", style: Theme.of(context).textTheme.headline1)), ElevatedButton( onPressed: () { countController.inc(); }, child: const Text("数值+1")) ], ), ); } }
myHome.dart执行dec方法
你可以让Get找到一个正在被其他页面使用的Controller,并将它返回给你。
final countController= Get.find<CountController>(); 或者 final CountController countController = Get.find();
代码:
import 'package:app_flutter01/pages/Key/messages.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; class myHome extends StatefulWidget { const myHome({super.key}); @override State<myHome> createState() => _myHomeState(); } class _myHomeState extends State<myHome> { final CountController countController = Get.find(); @override Widget build(BuildContext context) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Obx(() => Text("${countController.count}" )), ElevatedButton( onPressed: () { countController.dec(); }, child: const Text("数值-1")) ], ), ); } }
GetxController 绑定数据的几种方法
方法1:
CountController countController = Get.put(CountController()); //建议使用 或者 final CountController countController = Get.find();
Obx(()=>Text("${countController.count}",style:Theme.of(context).textTheme.headline1)),
方法2:
只是绑定数据无需调用 Get.put(CountController());
GetX<CountController>( init: CountController(), builder: (controller) { return Text( "${controller.count}", style: const TextStyle(color: Colors.green, fontSize: 30), ); }, ),
方法3:
CountController countController = Get.put(CountController()); 或者 final CountController countController = Get.find(); GetBuilder<CountController>( init: countController, builder: (controller) { return Text( "${controller.count}", style: const TextStyle(color: Colors.green, fontSize: 30), ); }, )
GetX Binding
需求:所有页面都要使用状态管理
在我们使用 GetX 状态管理器的时候,往往每次都是用需要手动实例化一个控制器,这样的话基本页面
都需要实例化一次,这样就太麻烦了,而 Binding 能解决上述问题,可以在项目初始化时把所有需要
进行状态管理的控制器进行统一初始化,接下来看代码演示:
在前面的文章中,我们经常使用 Get.put(MyController()) 来进行控制器实例的创建,这样我们就算
不使用控制器实例也会被创建,其实 GetX 还提供很多创建实例的方法,可根据不同的业务来进行创
建,接下来我们简单介绍一下几个最常用的
- Get.put(): 不使用控制器实例也会被创建
- Get.lazyPut(): 懒加载方式创建实例,只有在使用时才创建
- Get.putAsync(): Get.put() 的异步版版本
- Get.create(): 每次使用都会创建一个新的实例
第一步:声明需要进行的绑定控制器类
import 'package:get/get.dart'; class CountController extends GetxController { RxInt count = 0.obs; // 初始化一个可观察的变量count,初始值为0 void inc() { count++; // 递增count的值 update(); // 通知侦听器进行更新 } void dec() { count--; // 递减count的值 update(); // 通知侦听器进行更新 } }
import 'package:get/get.dart'; class BindingMyController extends GetxController { var count = 0.obs; void increment() { count++; } }
import 'package:app_flutter01/pages/Key/messages.dart'; import 'package:get/get.dart'; class AllControllerBinding implements Bindings { @override void dependencies() { // TODO: implement dependencies Get.lazyPut<CountController>(() => CountController()); //懒加载 Get.lazyPut<BindingHomeController>(() => BindingHomeController()); } }
第二步:在项目启动时进行初始化绑定
void main() { runApp(GetMaterialApp( title: "flutterAPP___test", initialBinding: AllControllerBinding(), //全局绑定GetxController home: Scaffold(body: MyFlutter1()))); }
第三步:在页面中使用状态管理器
class myHome extends StatefulWidget { const myHome({super.key}); @override State<myHome> createState() => _myHomeState(); } class _myHomeState extends State<myHome> { CountController countController = Get.find<CountController>(); //实例化控制器 @override Widget build(BuildContext context) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Obx(() => Text("${countController.count}" )), ElevatedButton( onPressed: () { countController.dec(); }, child: const Text("数值-1")) ], ), ); } }
分类:
Flutter
, Flutter+GetX 状态管理
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库