在 GetX 框架中,GetBuilder 和 GetX 都是用来构建响应式 UI 的,但它们在使用方式和适用场景上有一些不同。
- GetBuilder
作用: 用于监听控制器中的特定变量变化并重新构建部分 UI。
特点:
只有当 update() 方法被调用时,才会触发 UI 的重建。
适用于需要手动控制 UI 更新的场景。
适合用于复杂的 UI 组件,可以更细粒度地控制哪些部分需要更新。
示例代码:
class MyController extends GetxController {
var count = 0;
void increment() {
count++;
update(); // 手动调用 update() 方法
}
}
class MyHomePage extends StatelessWidget {
final MyController controller = Get.put(MyController());
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('GetBuilder Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
GetBuilder<MyController>(
builder: (controller) {
return Text(
'Count: ${controller.count}',
style: TextStyle(fontSize: 24),
);
},
),
ElevatedButton(
onPressed: controller.increment,
child: Text('Increment'),
),
],
),
),
);
}
}
这和原生android中LiveData使用有很大的相似性,其中update方法的作用仅仅只是通页面进行更新,并不是只更新increment方法中提到的count,若MyController 存在其他已变更的值,也会一同在页面上更新,如下例所示。
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class MyController extends GetxController {
var count = 0;
var time = 0;
void test() {
time++;
}
void increment() {
count++;
update(); // 手动调用 update() 方法
}
}
class MyHomePage extends StatelessWidget {
final MyController controller = Get.put(MyController());
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('GetBuilder Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
GetBuilder<MyController>(
builder: (controller) {
return Text(
'Count: ${controller.count}',
style: TextStyle(fontSize: 24),
);
},
),
GetBuilder<MyController>(
builder: (controller) {
return Text(
'Time: ${controller.time}',
style: TextStyle(fontSize: 24),
);
},
),
ElevatedButton(
onPressed: controller.increment,
child: Text('Increment'),
),
ElevatedButton(
onPressed: controller.test,
child: Text('Test'),
),
],
),
),
);
}
}
当我们先点击一次Test按键时,time的值已经变更为1,但由于页面未更新,页面上time显示的值仍为0,此时我们点击Increment按钮,会发现页面上time和count同时变更为1了。
2. GetX
作用: 用于监听控制器中的响应式变量变化并自动更新 UI。
特点:
当响应式变量(使用 .obs 标记)发生变化时,会自动触发 UI 的重建。
适用于简单的 UI 组件,可以自动管理状态的变化。
代码更加简洁,不需要手动调用 update() 方法。
示例代码:
class MyController extends GetxController {
var count = 0.obs; // 使用 .obs 将变量变为响应式
void increment() {
count.value++; // 直接修改响应式变量的值
}
}
class MyHomePage extends StatelessWidget {
final MyController controller = Get.put(MyController());
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('GetX Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Obx(() => Text(
'Count: ${controller.count.value}',
style: TextStyle(fontSize: 24),
)),
ElevatedButton(
onPressed: controller.increment,
child: Text('Increment'),
),
],
),
),
);
}
}