Flutter之GetX之Obs

发布时间 2023-04-05 14:06:40作者: R1cardo

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,还有其他方式可以使一个变量变成可观察状态

  1. 使用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>({});
  1. 使用泛型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种方法:

  1. 可以将我们的类值转换为 obs
class RxUser {
  final name = "Camila".obs;
  final age = 18.obs;
}
  1. 或者可以将整个类转换为一个可观察的类。
class User {
  User({String name, int age});
  var name;
  var age;
}

//实例化时。
final user = User(name: "Camila", age: 18).obs;

注意,转化为可观察的变量后,它的类型不再是原生类型,所以取值不能用变量本身,而是.value

虽然这种响应式编程非常好用,但是也不要用的太多了,因为底层其实都是Stream流的实现,用多了之后对内存消耗非常大,而 GetBuilderRAM 中是非常高效的,几乎没有比他更高效的方法。所以这些使用方式在使用过程中要斟酌。