flutter之:GetX 的 状态管理

1.状态管理

目前,Flutter的几种状态管理器,大多数都涉及到使用ChangeNotifier来更新widget,这对于中大型应用的性能来说是一个糟糕的方法。在Flutter官方文档中查到,ChangeNotifier应该使用1个或最多2个监听器,这使得它实际上无法用于任何中等或大型应用。

1.1其他的状态管理器的差别:

  • BLoC非常安全和高效,但是对于初学者来说非常复杂,这使得人们无法使用Flutter进行开发。
  • MobX比BLoC更容易,而且是响应式的,几乎是完美的,但是你需要使用一个代码生成器,对于大型应用来说,这降低了生产力,因为你需要喝很多咖啡,直到你的代码在flutter clean之后再次准备好(这不是MobX的错,而是codegen真的很慢!)。
  • Provider使用InheritedWidget来传递相同的监听器,以此来解决上面报告的ChangeNotifier的问题,这意味着对其ChangeNotifier类的任何访问都必须在widget树内。

Get并不是比任何其他状态管理器更好或更差,而是说你应该分析这些要点以及下面的要点来选择是只用Get,还是与其他状态管理器结合使用。Get不是其他状态管理器的敌人,因为Get是一个微框架,而不仅仅是一个状态管理器,它的状态管理功能既可以单独使用,也可以与其他状态管理器结合使用。

2.响应式状态管理器

当一个变量发生改变时,希望所有使用它的变量都会自动刷新;在Getx 中,通过给变量末尾添加“.obs",是其变得可观察就可以实现上述的功能了。

在Getx 中将 reactive-".obs"(ervables)变量称为_Rx_。

2.1声明响应式变量

  1. 使用 Rx{Type}。
// 建议使用初始值,但不是强制性的
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,规定泛型 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>();
  1. 添加 .obs 作为value的属性
final name = ''.obs;
final isLogged = false.obs;
final count = 0.obs;
final balance = 0.0.obs;
final number = 0.obs;
final items = <String>[].obs;
final myMap = <String, int>{}.obs;

// 自定义类 - 可以是任何类
final user = User().obs;

Dart 现在正朝着 null safety 的方向发展,在初始化一个_Rx_ 变量时总该有一个初始值。
用GetX将一个变量转化为一个_observable_ + _initial value_是最简单,也是最实用的方法。
只需在变量的末尾添加一个".obs",即可把它变成可观察的变量, 然后它的.value就是_初始值

2.2 使用视图中的值

// controller
final count1 = 0.obs;
final count2 = 0.obs;
int get sum => count1.value + count2.value;
// 视图
GetX<Controller>(
  builder: (controller) {
    print("count 1 rebuild");
    return Text('${controller.count1.value}');
  },
),
GetX<Controller>(
  builder: (controller) {
    print("count 2 rebuild");
    return Text('${controller.count2.value}');
  },
),
GetX<Controller>(
  builder: (controller) {
    print("count 3 rebuild");
    return Text('${controller.sum}');
  },
),

如果我们把count1.value++递增,就会打印出来

  • count 1 rebuild
  • count 3 rebuild

如果我们改变count2.value++,就会打印出来。

  • count 2 rebuild
  • count 3 rebuild

因为count2.value改变了,sum的结果现在是2。

  • 注意:默认情况下,第一个事件将重建小组件,即使是相同的值。 这种行为是由于布尔变量而存在的。因为_observable_的第一次变化将总是触发一个事件,即使它包含相同的.value

2.2.1 Get 精细状态控制

// 第一个参数:条件,必须返回true或false。
// 第二个参数:如果条件为真,则为新的值。
list.addIf(item < limit, item);

2.2.2 使用.obs的地方

  • 可以将类值转换为 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;

你可能感兴趣的:(flutter之:GetX 的 状态管理)