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 Getx 状态管理 --- (依赖管理) GetxController的更多相关文章

  1. Gradle 1.12用户指南翻译——第五十章. 依赖管理

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见:http://blog.csdn.net/column/details/gradle-translation.html翻译项目请关注Github上 ...

  2. Gradle笔记——依赖管理基础

    1. 什么是依赖管理 依赖管理可以分为两部分:一是依赖,即项目构建或运行时所需要的一些文件:二是发布,即构建完成后上传到某个地方. 1.1 依赖 大部分的项目都需要第三方库类或项目文件,这些文件就是项 ...

  3. 实用maven笔记二-信息&依赖管理

    目前我经历的公司的主要项目管理工具都是maven,maven除了是一个实用的构建工具外,也是一个功能强大的项目管理工具.其管理功能分为信息管理和依赖管理.通过pom.xml文件实现. 信息管理 信息管 ...

  4. Flutter 对状态管理的认知与思考

    前言 由 编程技术交流圣地[-Flutter群-] 发起的 状态管理研究小组,将就 状态管理 相关话题进行为期 两个月 的讨论. 目前只有内定的 5 个人参与讨论,如果你对 状态管理 有什么独特的见解 ...

  5. (转)flutter 新状态管理方案 Provide (一)-使用

    flutter 新状态管理方案 Provide (一)-使用     版权声明:本文为博主原创文章,基于CC4.0协议,首发于https://kikt.top ,同步发于csdn,转载必须注明出处! ...

  6. 为了弄懂Flutter的状态管理, 我用10种方法改造了counter app

    为了弄懂Flutter的状态管理, 我用10种方法改造了counter app 本文通过改造flutter的counter app, 展示不同的状态管理方法的用法. 可以直接去demo地址看代码: h ...

  7. flutter系列之:用来管理复杂状态的State详解

    目录 简介 StatefuWidget和State State的生命周期 总结 简介 Flutter的基础是widget,根据是否需要跟用户进行交互,widget则可以分为StatelessWidge ...

  8. Go 包依赖管理工具 —— govendor

    govendor 是一个基于 vendor 机制实现的 Go 包依赖管理命令行工具.与原生 vendor 无侵入性融合,也支持从其他依赖管理工具迁移,可以很方便的实现同一个包在不同项目中不同版本.以及 ...

  9. SSM实战——秒杀系统之创建项目、管理依赖、设计数据库

    注:本项目使用Myeclipse开发. 一:项目创建 1:使用Myeclipse创建一个web project,命名为MySeckill,并转换为Maven项目. 2:创建项目文件目录如下: 上面四个 ...

  10. 玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定

    前言 你好,我是A哥(YourBatman). 如何给Module模块单独增加依赖? 如何知道哪些Module模块用了Spring框架,哪些是web工程? IDEA如何打Jar包?打War包? 熟练的 ...

随机推荐

  1. .NET静态代码织入——肉夹馍(Rougamo)发布2.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo)通过静态代码织入方式实现AOP的组件,其主要特点是在编译时完成AOP代码织入,相比动态代理可以减少应 ...

  2. 记一次 .NET某新能源检测系统 崩溃分析

    一:背景 1. 讲故事 前几天有位朋友微信上找到我,说他的程序会偶发性崩溃,一直找不到原因,让我帮忙看一下怎么回事,对于这种崩溃类的程序,最好的办法就是丢dump过来看一下便知,话不多说,上windb ...

  3. cdq分治/整体二分

    cdq分治: 使用场景: 三维偏序问题 优化dp 将动态问题转静态问题 99%题目能离线的情况下cdq可以替代树套树,时空都更优秀 整体二分: 起初用来解决动态区间第K min/max,在最基础的二分 ...

  4. 浅析SpringBoot加载配置的6种方式

    从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但就是这么常用的功能,仍然有很多开发者抓狂-今天带大家简单回顾一下这六种的使用方式: 说明 Environment对象 Envi ...

  5. JUC并发编程学习(十一)四大函数式接口(必备)

    四大函数式接口(必备) 程序员:泛型.反射.注解.枚举 新时代程序员:lambda表达式.链式编程.函数式接口.Stream流式计算 函数式接口:只有一个方法的接口 @FunctionalInterf ...

  6. Redis Functions 介绍之二

    首先,让我们先回顾一下上一篇讲的在Redis Functions中关于将key的名字作为参数和非key名字作为参数的区别,先看下面的例子.首先,我们先在一个Lua脚本文件mylib.lua中定义如下的 ...

  7. php开发之文件上传的实现

    前言 php是网络安全学习里必不可少的一环,简单理解php的开发环节能更好的帮助我们去学习php以及其他语言的web漏洞原理 正文 在正常的开发中,文件的功能是必不可少,比如我们在论坛的头像想更改时就 ...

  8. Python小白入门指南:避免踩雷的10大错误!

    hello,大家好!新手小白踏入 Python 的大门有点像冒险,但别担心,我已经整理了一个超实用的入门指南,帮你规避学习过程中的十大雷区.这里有关于 Python 的错误你应该注意的建议,一起来看看 ...

  9. Go笔记(2)-5种运算符总结

    运算符 (1)算术运算符 (2)关系运算符 (3)逻辑运算符 (4)位运算符 (5)赋值运算符

  10. Socket.D 网络应用协议,首版发布!

    有用户说,"Socket.D 之于 Socket,尤如 Vue 之于 Js.Mvc 之于 Http" 主要特性 基于事件,每个消息都可事件路由 所谓语义,通过元信息进行语义描述 流 ...