使用篇

原理篇

一、简介

  • Obx:响应式状态管理,当数据源变化时,将自动执行刷新组件的方法
  • GetX:响应式状态管理,当数据源变化时,将自动执行刷新组件的方法
  • GetBuilder:简单状态管理,当数据源变化时,需要手动执行刷新组件的方法,此状态管理器内部实际上是对StatefulWidget的封装,占用资源极少!

二、GetBuilder

我们在controller获取数据之后,就会调用controller的update方法来更新界面。如果我们需要刷新对应的界面,就可以 使用GetBuilder将需要Builder的页面包起来如下:

 1GetBuilder<FirstController>(builder: (controller) {
 2  return Text('第一页');
 3})

在controller里如果直接update的话,默认刷新全部,但是如果我们只想刷新部分界面,可以直接在 GetBuilder的参数加个标识Id,然后和update里方法里的参数id相对应就行了。

 1class FirstController extends GetxController {
 2  int count = 0;
 3
 4  updateData() {
 5    update(['first']);
 6  }
 7}
 8
 9GetBuilder<FirstController>(
10  builder: (controller) {
11    return Text('第一页');
12  },
13  id: 'first',
14)

三、ValueBuilder

简化它的工作原理是使用采用更新值的回调。StatefulWidget.setState

 1ValueBuilder<bool>(
 2  initialValue: false,
 3  builder: (value, updateFn) => Switch(
 4    value: value,
 5    onChanged: updateFn, // same signature! you could use ( newValue ) => updateFn( newValue )
 6  ),
 7  // if you need to call something outside the builder method.
 8  onUpdate: (value) => print("Value updated: $value"),
 9  onDispose: () => print("Widget unmounted"),
10),

四、Getx、Obx和ObxValue

与ValueBuilder类似,但这是Reactive版本,您传递一个Rx实例(还记得神奇的.obs吗?)并自动更新…是不是很棒? obs是Getx提供的一个用来修饰变量的。被obs修饰过的变量,可以不使用GetBuilder,但是需要使用另一个widget,那就是obx,来包裹需要刷新的widget,不需要我们手动去update。

 1Obx(() => Text('第一页:${controller.count}')))
 2
 3  class FirstController extends GetxController {
 4  Rx<int> count = 0.obs;
 5
 6  updateData() {
 7    // update(['first']);
 8    count.value++;
 9  }
10}
11

另外一种形式的写法ObxValue 如下:

 1ObxValue(() => Text('第一页:${controller.count}'),count.obs)

当然Getx还提供了一个响应式的widget就是Getx,它和Obx都是响应式widget不需要手动update。

 1class SimplePage extends StatelessWidget {
 2  const SimplePage({Key? key}) : super(key: key);
 3
 4  @override
 5  Widget build(BuildContext context) {
 6    Get.put(SimpleController());
 7    return GetX<SimpleController>(builder: (controller) {
 8      return Scaffold(
 9        appBar: AppBar(title: const Text('Simple')),
10        body: GestureDetector(
11          onTap: () {
12            controller.increment();
13          },
14          child: Center(
15            child: Text('${controller.counter.value}'),
16          ),
17        ),
18      );
19    });
20  }
21}
22
23class SimpleController extends GetxController {
24  Rx<int> counter = 0.obs;
25
26  void increment() {
27    counter.value++;
28  }
29}
30
31![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
 1class GetX<T extends DisposableInterface> extends StatefulWidget {
 2  final GetXControllerBuilder<T> builder;
 3  final bool global;
 4
 5  // final Stream Function(T) stream;
 6  // final StreamController Function(T) streamController;
 7  final bool autoRemove;
 8  final bool assignId;
 9  final void Function(GetXState<T> state)? initState,
10  dispose,
11  didChangeDependencies;
12  final void Function(GetX oldWidget, GetXState<T> state)? didUpdateWidget;
13  final T? init;
14  final String? tag;
15
16  const GetX({
17    this.tag,
18    required this.builder,
19    this.global = true,
20    this.autoRemove = true,
21    this.initState,
22    this.assignId = false,
23    //  this.stream,
24    this.dispose,
25    this.didChangeDependencies,
26    this.didUpdateWidget,
27    this.init,
28    // this.streamController
29  });
30
31  ![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
32

当然要说Obx和Getx的区别的话,它提供参数比较多些,其中就包括了一下widget的生命周期。 如果我们想在widget生命周期做一些事,我觉得就可以 使用这个widget了。

五、GetView

GetX 提供了一个快捷的 Widget 用来访问容器中的 controller,即 GetView。GetView是一个继承 StatelessWidget的抽象类, GetView 是一个const Stateless的Widget,如果我们只有单个控制器作为依赖项,那我们就可以使用GetView,而不是使用StatelessWidget,并且避免了写Get.Find()。 可以看到GetView的源码已经帮你写好了。

 1abstract class GetView<T> extends StatelessWidget {
 2  const GetView({Key? key}) : super(key: key);
 3
 4  final String? tag = null;
 5
 6  T get controller => GetInstance().find<T>(tag: tag)!;
 7
 8  @override
 9  Widget build(BuildContext context);
10}

然后控制器的注册要写在bindings中,可以看这里 Flutter 全能型选手GetX —— 依赖管理

六、GetWidget

GetWidget不是个const Stateless视图,它缓存了一个控制器。由于缓存,不能成为一个 “const Stateless”(因为缓存,所以不能成为一个const Stateless)。当我们使用Get.create(()=>Controller())会在每次调用时生成一个新的Controlle,Get.find()` 因为我们平时一般不需要缓存控制器,所以一般很少使用。

七、总结

一般来说,对于大多数场景都是可以使用响应式变量。但是每个响应式变量(.obs),都需要生成对应的 Stream,如果对象足够多,将生成大量的 Stream,必将对内存造成较大的压力,该情况下,就要考虑使用简单状态管理了

个人笔记记录 2021 ~ 2025