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. Go语言精进之路目录

    目录 一.介绍 01.Go 语言的前生今世 二.开发环境搭建 01.Go 语言开发环境搭建 三.初识GO语言 01.Go 多版本管理工具 02.第一个 Go 程序"hello,world&q ...

  2. 教育法学第八章单元测试MOOC

    第八章单元测试 返回 本次得分为:100.00/100.00, 本次测试的提交时间为:2020-09-06, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(5分) 社团法人与财团法 ...

  3. Docker 安装 Redis 单机&集群总结

    前言 Redis 是一个开源的使用 ANSI C 语言编写.遵守 BSD 协议.支持网络.可基于 内存 . 分布式 .可选持久性的键值对( Key-Value )存储数据库 redis版本:redis ...

  4. Noi-Linux 2.0 装机+使用整合

    写在前面 网上的东西比较多,也比较杂乱,不是很方便,所以我整合了一些关于 Noi-Linux2.0 虚拟机装机方法+代码编辑环境+实地编程的介绍,看完至少能用起来打代码了. NOI 官网公告(JS 开 ...

  5. H5-geolocation学习

    geolocation--定位 PC--IP地址 精度比较低 IP库 Chrome -> Google 手机--GPS window.navigator.geolocation 单次 getCu ...

  6. JS逆向实战25——某壳找房模拟登录+百度喵星人指纹加密破解.

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标 目标网站 aHR0c ...

  7. Eclipse设置GC日志输出

    今天看了关于垃圾回收的书籍,然后自己就想自己试试,自己就在eclipse里面配置了日志输出.方法如下: 1 右键项目,选择properties 2 选择run/debug setting  新建一个a ...

  8. 使用openpyxl库读取Excel文件数据

    在Python中,我们经常需要读取和处理Excel文件中的数据.openpyxl是一个功能强大的库,可以轻松地实现Excel文件的读写操作.本文将介绍如何使用openpyxl库读取Excel文件中的数 ...

  9. 国产瀚高数据库简单实践 及 authentication method 13 not supported 错误解决方法

    近几年IT界软硬件"国产化"搞得很密集,给很多公司带来了商机.但是有些公司拿国外的代码改改换个皮肤,就是"自主知识产权"的国产软件,光明正大卖钱,这个有点... ...

  10. vue通过地址下载文件

    通过a标签 // 创建a标签 const link = document.createElement('a') // download属性 link.setAttribute('download', ...