GetX数据管理总结
GetX数据管理总结
Get有两个不同的状态管理器:简单的状态管理器(GetBuilder)和响应式状态管理器(GetX和Obx)。
简单状态管理
简单状态管理,当数据源变化时,需要手动执行刷新组件的方法,此状态管理器内部实际上是对StatefulWidget的封装,占用资源极少
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class CounterController extends GetxController {
int count = 0; // 普通状态,没有使用obx设置为响应式变量
void increment() {
count++;
update(); // 当状态改变时,手动通知 GetBuilder 重新构建 UI。
}
}
void main() {
runApp(
GetMaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('GetBuilder Example')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GetBuilder<CounterController>(
init: CounterController(),
builder: (controller) {
return Text('Count: ${controller.count}');
},
),
ElevatedButton(
onPressed: () {
Get.find<CounterController>().increment();
},
child: Text('Increment'),
),
],
),
),
),
),
);
}
响应式状态管理
Obx和GetX:响应式状态管理,当数据源变化时,将自动执行刷新组件的方法;
但Getx允许在构建时初始化控制器,并且在
builder函数中直接使用传入的控制器实例。
/**
* Obx方式
**/
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class CounterController extends GetxController {
var count = 0.obs;
void increment() {
count.value++;
}
}
// CounterController 中的 count 是一个可观察变量,Obx 监听 count 的变化,当 increment 方法被调用使 count 值改变时,Obx 内部的 Text 组件会自动更新。
void main() {
Get.put(CounterController()); // 注册控制器
runApp(
GetMaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Obx Example')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Obx(() => Text('Count: ${Get.find<CounterController>().count}')),
ElevatedButton(
onPressed: () {
Get.find<CounterController>().increment();
},
child: Text('Increment'),
),
],
),
),
),
),
);
}
/**
* GetX实现方式
*/
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class CounterController extends GetxController {
var count = 0.obs;
void increment() {
count.value++;
}
}
// GetX 通过 init 初始化控制器,在 builder 函数中可以直接使用传入的控制器实例来访问其状态和方法。
void main() {
runApp(
GetMaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('GetX Example')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GetX<CounterController>(
init: CounterController(),
builder: (controller) {
return Text('Count: ${controller.count}');
},
),
ElevatedButton(
onPressed: () {
Get.find<CounterController>().increment();
},
child: Text('Increment'),
),
],
),
),
),
),
);
}
使用场景
Obx:适用于需要实时响应状态变化的场景,尤其是状态变化频繁且需要自动更新 UI 的情况。例如,实时显示输入框的内容、实时更新计数器的值等。GetX:和Obx适用场景类似,但当你希望在构建时初始化控制器并直接使用控制器实例时,使用GetX会更方便。GetBuilder:适合状态变化不频繁,或者你希望手动控制 UI 更新的场景。例如,在某些操作完成后才更新 UI,这样可以减少不必要的 UI 重建,提高性能。
性能表现
Obx和GetX:由于它们基于响应式编程,会自动监听状态变化,可能会有一定的性能开销。不过,GetX 框架在设计上已经做了优化,能尽量减少不必要的重建。GetBuilder:因为需要手动调用update方法来更新 UI,所以可以更精确地控制 UI 重建的时机,在一些情况下能减少性能开销。但如果忘记调用update方法,UI 就不会更新。
总结
一般来说,对于大多数场景都是可以使用响应式变量。但是每个响应式变量(.obs),都需要生成对应的 Stream,如果对象足够多,将生成大量的 Stream,必将对内存造成较大的压力,该情况下,就要考虑使用简单状态管理了

浙公网安备 33010602011771号