• Flutter中使用GetX进行响应式状态管理
  • 发布于 2个月前
  • 209 热度
    0 评论
  • pckillers
  • 0 粉丝 30 篇博客
  •   
前言
本篇开始来讲解 GetX 的响应式状态管理。关于响应式状态管理,GetX 官方文档提到了具有如下优点:
1.无需创建 StreamController;
2.无需为每个变量创建 StreamBuilder;
3.无需为每个状态创建一个类;
4.无需为一个初始值创建一个 get 方法;
5.使用 GetX 响应式编程非常简单,就像使用 setState 一样。

反正吹牛不需要上税,但是是不是真的这么好用,我们得跑几个例子看看才知道。

监测变量
GetX 的监测变量非常简单,只需要在定义的时候假设.obs 即可,例如:
var name = 'duidaima'.obs;
这里面到底怎么实现的呢?在 GetX 中为 String对象创建了一个 Stream,赋予了初始值,然后会通知所有使用该对象的 Widget。一旦这个对象的值发生了改变,就会刷新这些组件。这是通过 Obx 组件实现的,下面是一个简单的示例``。
class SimpleReactiveController extends GetxController {
  final _name = ' duidaima'.obs;
  set name(value) => this._name.value = value;
  get name => this._name.value;
}

class SimpleReactivePage extends StatelessWidget {
  SimpleReactivePage({Key? key}) : super(key: key);
  final SimpleReactiveController simpleController = SimpleReactiveController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('响应式状态管理'),
      ),
      body: Center(
        child: Obx(
          () => Text('${simpleController.name}'),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.refresh),
        onPressed: () {
          simpleController.name = 'island-coder';
        },
      ),
    );
  }
}
这里和setState有个区别,GetX 扩展的.obs 用法内部做了是否相等的比较,如果更新操作前后的对象是相等的话,那么不会通知组件刷新,从而提高性能。对于一个Controller拥有多个对象的时候,当这些对象发生改变的时候,也只会更新那些依赖这些对象的组件,而不是所有依赖 Controller 的组件。

声明状态对象的方法
在 GetX 的响应式状态管理中,有三种方式声明状态变量,在 GetX 中这些状态变量统一称之为 Rx 变量。
方式一:Rx{Type}
即在基本的类型中假设 Rx 前缀,初始值可以设置,但推荐是给对象初始值(对于 null safety 版本,必须要提供初始值)。
final name = RxString('');
final isLogged = RxBool(false);
final count = RxInt(0);
final balance = RxDouble(0.0);
final items = RxList<String>([]);
final myMap = RxMap<String, int>({});
方式二:Rx 泛型
使用泛型的范围更广,可以将任何类转为 Rx 变量,包括自定义类型。
final name = Rx<String>('');
final isLogged = Rx<Bool>(false);
final count = Rx<Int>(0);
final balance = Rx<Double>(0.0);
final number = Rx<Num>(0);
final items = Rx<List<String>>([]);
final myMap = Rx<Map<String, int>>({});

// 自定义类
final user = Rx<User>();
方式三:.obs 扩展
使用.obs 扩展更使用也更简洁,对于需要监测的对象来说,加上.obs扩展即可。
// 堆代码 duidaima.com
final name = ''.obs;
final isLogged = false.obs;
final count = 0.obs;
final balance = 0.0.obs;
final number = 0.obs;
final items = <String>[].obs;
final myMap = <String, int>{}.obs;

// 自定义类
final user = User().obs;

在视图中使用 Rx 变量
有两种方式在视图中使用 Rx 变量,一种是上面我们说的使用 Obx 组件,还有一种方式是使用 GetX<T>组件,如下所示:
//方式一
Obx(() => Text('${simpleController.name}'),),

// 方式二
GetX<SimpleReactiveController>(
  builder: (controller) => Text('${simpleController.name}'),
  init: simpleController,
),

总结
本篇介绍了 GetX 的响应式状态管理的基本概念和用法,相比GetBuilder这种简单的方式而言,响应式还有很多更高级的用法,我们接下来的篇章会继续介绍。
用户评论