首页 > 其他分享 >状态-Getx

状态-Getx

时间:2023-04-21 10:23:46浏览次数:43  
标签:状态 name Text counter 更新 Getx GetBuilder 变量

原文地址 zhuanlan.zhihu.com

状态-Getx

残枫cps残枫cps

GetxController 生命周期

整个生命周期我们能够接入的方法就三个:

  • onInit:初始化 Controller,例如一些成员属性的初始化;
  • onReady:就绪后的业务处理,如异步操作、导航进入的参数处理等;
  • onClose:释放资源,避免内存泄露,同时也可以进行数据持久化。

GetBuilder 是一个 Widget 组件, 在 GetX 的状态管理中,GetBuilder 的主要作用是结合 GetxController 实现界面数据的更新。当调用 GetxController 的 update 方法时,GetBuilder 包裹的 Widget 就会刷新从而实现界面数据的更新。

局部更新

多种状态可以分别更新,不需要为每个状态创建一个类。

再添加一个变量:

  1. int _counter = 0;
  2. int get counter => _counter;
  3. String _name = "Lili";
  4. String get firstName => _name;
  5. void increment() {
  6. _counter++;
  7. _name = WordPair.random().asPascalCase;
  8. update(['counter']);
  9. }
  10. void changeName() {
  11. _counter++;
  12. _name = WordPair.random().asPascalCase;
  13. update(['name']);
  14. }

两个方法分别改变两个变量,但是注意update(['counter']里添加了 id 数组,这样就只更新这个 id 对应的GetBuilder:

  1. GetBuilder(
  2. id: 'counter',
  3. builder: (ctl) => Text(ctl.counter.toString()),
  4. ),
  5. SizedBox(
  6. height: 50,
  7. ),
  8. GetBuilder(
  9. id: 'name',
  10. builder: (ctl) => Text(ctl.firstName),
  11. ),

响应式刷新

我们都用过 StreamControllers ,然后以流的方式发送数据。在 GetX 可以实现同样的功能,并且实现起来只有几个单词,不需要为每个观察的对象创建一个 StreamController ,也不需要创建 StreamBuilder。

var name = '新衣';

下面简单的一个后缀就可以把一个变量变得可观察,变量每次改变的时候,使用它的小部件就会被更新:

var name = '新衣'.obs;

就这么简单,这个变量已经是响应式的了。然后通过 Obx 或者 GetX 包裹并使用响应式变量的控件,在变量改变的时候就会被更新:

Obx (() => Text (controller.name));

下面写个计算器的例子:

  1. final count1 = 0.obs;
  2. final count2 = 0.obs;

.obs就实现了一个被观察者,他们不再是 int 类型,而是 RxInt 类型。对应的小部件也不再是GetBuilder了,而是下面两种:

  1. GetX(
  2. builder: (_) {
  3. print("count1 rebuild");
  4. return Text(
  5. '${_.count1}',
  6. style: TextStyle(fontWeight: FontWeight.bold),
  7. );
  8. },
  9. ),
  10. Obx(() => Text(
  11. '${Get.find().count2}',
  12. style: TextStyle(fontWeight: FontWeight.bold),
  13. )),

因为是响应式,不再需要update,每次更改值,都自动刷新。但是更神奇的是,他们的运算和也是响应式的:

int get sum => count1.value + count2.value;

只要更新count1或者count2使用sum的小部件也会更改:

  1. Obx(() => Text(
  2. '${Get.find().sum}',
  3. style: TextStyle(fontWeight: FontWeight.bold),
  4. )),

setState

当调用setState后,所在Widget会进行重新渲染,这样便实现了页面上显示数据的更新。

下方代码中,点击按钮是否会触发页面上的数字变化?

class XXXState extends State<TestPage> {
  var click = 0;
  Widget w;

  @override
  void initState() {
    super.initState();
    w = Column(
      children: <Widget>[
        Text("${click}"),
        RaisedButton(
          child: Text("点击"),
          onPressed: () {
            click++;
            setState(() {});
          },
        ),
      ],
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: w,
    );
  }
} 

...

解答:不会变化,因为w变量中的组件,并没有重新实例化,所有w的状态一直都保持不变,组件一直保存在变量w中。

点击按钮确实会使当前组件重新渲染、会重新调用build,但是其中的子组件w,并没有重新实例化,其中的状态也没有发生任何改变

标签:状态,name,Text,counter,更新,Getx,GetBuilder,变量
From: https://www.cnblogs.com/cps666/p/17339373.html

相关文章

  • TCP连接状态的多种判断方法
    ​前言在TCP网络编程模型中,无论是客户端还是服务端,在网络编程的过程中都需要判断连接的对方网络状态是否正常。在linux系统中,有很多种方式可以判断连接的对方网络是否已经断开。通过错误码和信号判断通过select系统函数判断通过TCP_INFO套接字选项判断通过SO_KEEPALIVE套接......
  • 状态模式控制设备
    状态模式是一种行为型设计模式,它允许对象在内部状态发生变化时改变它的行为。在这个场景中,我们可以将自动、半自动、手动三种工作模式看做是不同的状态,根据不同的状态来执行不同的行为。下面是使用C#状态模式来编写自动、半自动、手动功能模块程序的示例代码:创建一个抽象状态接......
  • 探索FSM (有限状态机)应用
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。。本文作者:木杪有限状态机(FSM)是计算机科学中的一种数学模型,可用于表示和控制系统的行为。它由一组状态以及定义在这些状态上的转换函数组成。FS......
  • WPF中弹出界面在不影响状态栏的情况下占满界面
    举例子:比如在MainView.xaml.cs可以写在Window_Loaded事件中privatevoidWindow_Loaded(objectsender,RoutedEventArgse){this.Left=0.0;this.Top=0.0;this.Height=SystemParameters.WorkArea.Height;this.Width=SystemParameters.Work......
  • font-display 文本在网页字体加载期间保持可见状态
    为确保文本在网页字体加载期间保持可见状态,可以考虑以下几种方法:1.使用系统默认字体或web-safe字体:这些字体通常是已经在大多数操作系统和浏览器中安装和加载的,因此在页面加载期间可以立即呈现。这样,即使自定义字体尚未加载,文本也将始终可见。2.通过CSS实现字体预加载:可以在C......
  • 实时查看Docker容器占用的CPU、内存状态
    安装Linux下安装方法:wgethttps://github.com/bcicen/ctop/releases/download/v0.5/ctop-0.5-linux-amd64-Octopsudomvctop/usr/local/bin/sudochmod+x/usr/local/bin/ctop执行命令:ctop使用ctop运行后,通过下面的按键可以实现不同的功能1)a-只查看运行状态的容器f-......
  • http模拟状态码
    引言HTTP状态码是客户端(浏览器)和服务器之间进行通信的基础。当浏览器请求网页时,服务器会返回一个状态码,告诉浏览器请求的网页是否成功、失败或有其他问题。在本文中,将讨论HTTP状态码及使用Nginx做代理模拟常见状态码。本文分为两部分HTTP状态码基础介绍HTTP状态码模拟实......
  • 【线程基础】【二】线程的状态流转
    1 前言上节我们看了线程是如何创建启动的,那么启动以后线程怎么管理呢,这就要看我们线程的状态管理了,这节我们就来看看线程都有哪些状态以及什么操作下会驱使状态的变化流转。2 状态定义Java线程有6种状态定义在Thread的子类State,分别是NEW、RUNNABLE、BLOCKED、WAITING、TIM......
  • vue全家桶进阶之路37:Vue3 状态管理
    Vue3的状态管理主要是通过Vuex4来实现。Vuex是一个专为Vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。在Vue3的状态管理中,以下是各个属性的作用:state:存储应用程序中的状态数据。它可以......
  • day12_响应状态码
    一、状态码大类状态码分类说明1xx响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它2xx成功——表示请求已经被成功接收,处理已完成3xx重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。4xx客户端......