Flutter 入门与实战(八十三):GetX 状态管理怎么用,看这一篇就够了!
前言
GetX 从前到后我们也写了10多篇了,本篇对 GetX 状态管理部分的用法做一下总结,在实际开发过程中可以根据自身需要针对性的选择具体的用法。
简单状态管理 GetBuilder
GetBuilder
最大的好处是简单易用,尤其是对于从 Proivider
迁移过来的时候,代码改动量是很小的。编写的过程如下:
- 编写
Controller
代码,在 VSCode 里 安装了GetX Snippets
插件后可以使用get controller
快速插入Controller
代码模板。 - 将使用到状态对象的
Widget
使用GetBuilder
包裹起来,如下所示:
Widget build(BuildContext context) {
return GetBuilder<CounterController>(
// 初始化 Controller
init: Controller(),
// 在 builder里返回具体的 Widget
builder: (controller) => XXXWidget(),
);
}
static CounterController get to => Get.find();
实际上 GetBuilder
是一个 StatefulWidget
的子类,在 update
被调用的时候,会调用builder
参数的方法来刷新对应的组件。
响应式状态管理GetX
还有一种更简洁的用法,那就是 Obx
,但是这种方式有个缺陷那就是状态对象 GetxController
的生命周期函数不会被调用,更适用于简单的组件,性能当然也会更高些。
class CounterController extends GetxController {
var _counter = 0.obs;
static CounterController get to => Get.find();
get counter => _counter.value;
void increment() {
_counter.value++;
}
}
class CounterPage extends StatelessWidget {
CounterPage({Key? key}) : super(key: key);
final CounterController controller = CounterController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('GetX计数器'),
),
body: Center(
child: Obx(() => Text('${controller.counter}')),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
controller.increment();
},
),
);
}
}
混入页面状态StateMixin
class PersonalHomePageMixin extends GetView<PersonalMixinController> {
PersonalHomePageMixin({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return controller.obx(
(personalEntity) => _PersonalHomePage(personalProfile: personalEntity!),
onLoading: Center(
child: CircularProgressIndicator(),
),
onError: (error) => Center(
child: Text(error!),
),
onEmpty: Center(
child: Text('暂无数据'),
),
);
}
}
四种方式的比较
官方对于这四种方式(Obx
也算一种)给出了优劣说明:
GetBuilder
消耗的内存最小,性能最优,当然代码可维护性来说就会牺牲一点,毕竟需要手动调用update
。Obx
的性能次之,优势是可以同时监听多个Controller
的状态对象变化。缺点是Controller
没有生命周期函数,而且Controller
需要在Obx
之外先初始化(这个倒问题不大,可以通过容器解决)。GetX
更贴近实际项目一些,通过响应式的状态管理使得代码的可维护性更高。当然性能上会有些许损失。StateMixin
更像是一个粘合剂,将页面的数据状态和对象粘合起来,然后简化我们构建不同状态页面的代码结构。性能上是最低的,当然这个性能差别在很多时候是体现不出来的。
至于具体怎么选择,看项目实际需要吧。
总结
本篇对 GetX 的几种状态管理用法进行了对比总结,可以看到,在状态管理方式上,GetX 提供了多样化的选择,好处是我们可以根据自己的需要自由选择。当然缺陷也是有的,多样化之后意味着同一个工程可能出现多种方式,这对代码结构的统一上不太方便。因此,实际开发中最好是约定好使用其中的1-2种方式。关于 GetX,网上的评价大多数是好评,在 pub 上的流行度也达到了99%,GitHub上目前超过了4.6k 的 star,整体来说用于生产是没问题的。当然,它也有一定的缺陷,下面一篇我们会结合一篇国外的文章客观地看一下 GetX 的缺陷。
转载自:https://juejin.cn/post/7012766280394489893