Flutter之GetX之Obs
Flutter之GetX之Obs
除了之前说过的GetBuilder,GetX还有其他的状态管理方式
一个后缀就可以把一个变量变得可观察,变量每次改变的时候,使用它的小部件就会被更新
var name = '周杰伦'.obs;
然后通过 Obx 或者 GetX 包裹并使用响应式变量的控件,在变量改变的时候就会被更新
Obx (() => Text (controller.name));
.obs就实现了一个被观察者,他们不再是 int 类型,而是 RxInt 类型。对应的小部件也不再是GetBuilder了,而是下面两种
GetX<SumController>(
builder: (_) {
return Text(
'${_.count1}',
style: TextStyle(fontWeight: FontWeight.bold),
);
},
)
Obx(() => Text(
'${Get.find<SumController>().count2}',
style: TextStyle(fontWeight: FontWeight.bold),
)),
除了通过添加后缀.obs,还有其他方式可以使一个变量变成可观察状态
- 使用GetX中的RxType
// 建议使用初始值,但不是强制性的
final name = RxString('');
final isLogged = RxBool(false);
final count = RxInt(0);
final balance = RxDouble(0.0);
final items = RxList<String>([]);
final myMap = RxMap<String, int>({});
- 使用泛型Rx
final name = Rx<String>('');
final isLogged = Rx<Bool>(false);
final count = Rx<Int>(0);
final balance = Rx<Double>(0.0);
final number = Rx<Num>(0)
final items = Rx<List<String>>([]);
final myMap = Rx<Map<String, int>>({});
// 自定义类 - 可以是任何类
final user = Rx<User>();
将一个对象转变成可观察的,也有2种方法:
- 可以将我们的类值转换为 obs
class RxUser {
final name = "Camila".obs;
final age = 18.obs;
}
- 或者可以将整个类转换为一个可观察的类。
class User {
User({String name, int age});
var name;
var age;
}
//实例化时。
final user = User(name: "Camila", age: 18).obs;
注意,转化为可观察的变量后,它的类型不再是原生类型,所以取值不能用变量本身,而是.value
虽然这种响应式编程非常好用,但是也不要用的太多了,因为底层其实都是Stream流的实现,用多了之后对内存消耗非常大,而 GetBuilder 在 RAM 中是非常高效的,几乎没有比他更高效的方法。所以这些使用方式在使用过程中要斟酌。