正如标题所示,有几种更新状态的方法。我什么时候应该选择一种而不是另一种?
对此没有硬性规定,但我尝试做出以下决定:
initState
调用,我想要在底层,Obx 和 GetX 都使用流,订阅控制器可观察变量更改流以了解何时进行反应式重建。
GetBuilder 没有。
GetX 和 GetBuilder 都扩展了
StatefulWidget
在GetX包中有两种编写控制器的方法:
第一:
class Controller extends GetxController {
int counter = 0;
void increment() {
counter++;
update();
}
}
这称为简单状态管理器。它使用一个简单的回调来通知消费者小部件。并且该小部件只能是 GetBuilder。
GetBuilder<Controller>(
builder: (controller) => Text(
'${controller.counter}',
),
)
GetBuilder 的性能超级友好。应尽可能使用它。
控制器的第二种写法:
class Controller extends GetxController {
var count = 0.obs;
increment() {
count.value++;
//refresh();
}
}
这称为反应式状态管理器。它在底层使用流。流很棒,但它们消耗大量资源。
要使用这种状态,我们需要 Obx 或 GetX。
Obx 示例:
child: Obx(
() => Text(
'${controller.counter}',
),
),
Obx 无法使用控制器类型进行参数化,因此要获取控制器实例,我们应该将 GetView 或 GetWidget 或 StatelessWidget 与 Get.find 结合使用。
这就是 GetX 小部件可以提供帮助的地方。
GetX 示例:
GetX<Controller>(
init: Get.put<Controller>(Controller()),
builder: (controller) {
return Text( '${controller.counter}');
},
)
Obx 和 GetX 的区别在于 GetX 有 init 和 builder 属性。此外,GetX 可以通过控制器类型进行参数化。 init 属性是可选的。仅当控制器尚未初始化时才需要。
结论 尽可能使用 GetBuilder。它对性能非常友好。 👍 仅在必要时才使用 Obx 和 GetX。 将 Obx 与 GetView 或 GetWidget 或 Get.find 结合使用。 当您想要直接在小部件内初始化控制器时,请使用 GetX。 来自这篇文章