GetX 状态管理从入门到入迷

作者: 岛上码农 | 来源:发表于2022-03-17 21:32 被阅读0次

    前言

    GetX 为状态管理提供了两种方式,一种是简单的方式,使用 GetBuilder 形式实现,另一种方式是响应式状态管理。简单的方式十分轻量和简单,而且无需使用 ChangeNotifier。对于初学者来说,通过这种方式了解GetX 的状态管理会更容易入手,而且就算是大型应用这种方式也是 OK 的。本篇以最简单的计数器来讲解 GetX 的简单状态管理

    状态类

    状态类在 GetX 中称之为 Controller,需要继承GetxController,当状态发生改变的时候,调用update 方法即可通知依赖状态的组件进行刷新。在 VSCode 中安装好 GetX Snippets 插件,我们使用 getcontroller 指令就可以快速输入状态模板代码。我们的最简单的计数器状态代码如下所示:

    class CounterController extends GetxController {
      int _counter = 0;
    
      get counter => _counter;
    
      void increment() {
        _counter++;
        update();
      }
    }
    

    视图界面

    界面层在需要使用状态的地方使用 GetBuilder 包裹,然后就可以使用 Controller 访问状态对象和操作状态方法了。其中GetBuilder只需要两个参数:

    • init:初始状态对象,在这里可以完成状态对象的初始化。
    • builder 方法:这个方法用于构建依赖状态的组件树,方法携带状态对象参数,因此下面的组件可以访问到状态对象。而且一旦状态对象通过 update 方法通知有更新时,依赖状态对象的组件就会被刷新。

    计数器的视图界面的 build 代码如下,可以看到整个使用十分简洁。

    Widget build(BuildContext context) {
      return GetBuilder<CounterController>(
        init: CounterController(),
        builder: (controller) => Scaffold(
          appBar: AppBar(
            title: Text('GetX计数器'),
          ),
          body: Center(
            child: Text(
              '${controller.counter}',
              style: TextStyle(
                color: Colors.blue,
                fontSize: 24.0,
              ),
            ),
          ),
          floatingActionButton: FloatingActionButton(
            child: Icon(Icons.add),
            onPressed: () {
              controller.increment();
            },
          ),
        ),
      );
    }
    

    深入优化

    上面的这种方式有个缺点,那就是GetBuilder包裹了整个 Scaffold ,如果 Scaffold 的组件树很大会导致性能问题。我们应该只包裹依赖状态对象的组件。但对于这个例子来说,FloatingActionButton和 Text 并不在一个层级上,对于这种情况,GetX 提供了一种共享状态的方法。在状态类中实现一个静态的 Get.find()别名方法即可。

    static CounterController get to => Get.find();
    

    有了这个方法后,只要状态对象注册一次之后,就可以在任何地方使用CounterController.to访问到了。现在,我们改造后的计数器界面代码就可以最小化状态对象的依赖了。

    Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GetX计数器'),
      ),
      body: Center(
        child: GetBuilder<CounterController>(
          init: CounterController(),
          builder: (_) => Text(
            '${CounterController.to.counter}',
            style: TextStyle(
              color: Colors.blue,
              fontSize: 24.0,
            ),
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          CounterController.to.increment();
        },
      ),
    );
    

    总结

    本篇我们介绍了GetX 的简单状态管理 GetBuilder 和状态类的构建,这种方式借助 GetX Snippets插件后,编码的工作并不多,这也是GetX 生产力的体现(看到这个是不是马上入迷,想抛弃其他状态管理插件,直接选用 GetX?)。我们还介绍了如何进行状态共享和最小化 GetBuilder 的作用范围,从而减少不必要的组件刷新,提高性能。下一篇我们介绍这种方式和网络请求结合,看看有网络请求(异步操作的时候怎么完成状态更新)。

    相关文章

      网友评论

        本文标题:GetX 状态管理从入门到入迷

        本文链接:https://www.haomeiwen.com/subject/lcsbdrtx.html