写点什么

GetX 状态管理从入门到入迷

作者:岛上码农
  • 2022 年 6 月 15 日
  • 本文字数:1591 字

    阅读完需:约 5 分钟

GetX 状态管理从入门到入迷

前言

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 的作用范围,从而减少不必要的组件刷新,提高性能。下一篇我们介绍这种方式和网络请求结合,看看有网络请求(异步操作的时候怎么完成状态更新)。


发布于: 刚刚阅读数: 3
用户头像

岛上码农

关注

用代码连接孤岛,公众号@岛上码农 2022.03.03 加入

从南漂到北,从北漂到南的业余码农

评论

发布
暂无评论
GetX 状态管理从入门到入迷_flutter_岛上码农_InfoQ写作社区