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 重建,提高性能。

性能表现

  • ObxGetX:由于它们基于响应式编程,会自动监听状态变化,可能会有一定的性能开销。不过,GetX 框架在设计上已经做了优化,能尽量减少不必要的重建。
  • GetBuilder:因为需要手动调用 update 方法来更新 UI,所以可以更精确地控制 UI 重建的时机,在一些情况下能减少性能开销。但如果忘记调用 update 方法,UI 就不会更新。

总结

一般来说,对于大多数场景都是可以使用响应式变量。但是每个响应式变量(.obs),都需要生成对应的 Stream,如果对象足够多,将生成大量的 Stream,必将对内存造成较大的压力,该情况下,就要考虑使用简单状态管理了

posted @ 2025-03-05 00:24  CD、小月  阅读(88)  评论(0)    收藏  举报