在 GetXController 中持久保存/存储数据的正确方法

Proper way to persist / store data in GetXController in flutter

我有这个 class 并使用“反应式”状态管理,例如

"".obs

现在我打算从本地存储中初始化我的状态 (get_storage) onInit()

问题:

我在哪里保存我的数据?一旦一些状态发生变化,我也想持久化。

我尝试使用侦听器,但它从未触发。

目前我有这个:

class CosController extends GetxController {
  final box = GetStorage();

  RxString econtactnr = ''.obs;

  @override
  void onInit() {
    super.onInit();
    addListener(() { //NEVER fires
      print('hellowwww listener');
    });
    econtactnr.value = box.read('econtactnr') ?? '';
}

在 GetXControllers 中使用反应状态管理将状态存储到磁盘的最佳做法是什么?

编辑:我注意到你可以这样做:

    econtactnr.listen((x) {
      box.write('econtactnr', econtactnr.value);
    });

问题:可以吗?我是否也必须取消该订阅?

GetX 为此类功能提供 Workersever 方法可以监听并存储更新后的值。

在您的 onInit

中试试这个
  @override
  void onInit() {
    super.onInit();
    econtactnr.value = box.read('econtactnr') ?? '';
    ever(
      econtactnr,
      (value) {
        box.write('econtactnr', value);
      },
    );
  }

只要在使用 Get.put(CosController());

初始化之前发生 await GetStorage.init();,这就会起作用并持续存在

如果您需要在应用程序的整个生命周期中存储它,那么您无需担心处置它,因为您总是希望它能够监听。

如果您出于任何原因确实想要处理它,您可以将侦听器保存到 Worker 变量中。

 Worker worker;

  @override
  void onInit() {
    super.onInit();
    econtactnr.value = box.read('econtactnr') ?? '';
    worker = ever(
      econtactnr,
      (value) {
        box.write('econtactnr', value);
        debugPrint(value);
      },
    );
  }

然后使用worker.dispose();

进行处理