首页 > 解决方案 > 在颤动中将数据持久化/存储在 GetXController 中的正确方法

问题描述

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

"".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);
    });

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

标签: flutterflutter-getx

解决方案


GetX为此类功能提供了Workers 。ever方法可以在更新值更改时侦听并存储它。

试试这个onInit

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

只要您await GetStorage.init();在初始化之前发生这种情况,这将起作用并持续存在Get.put(CosController());

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

如果您出于某种原因确实想处理它,您可以将侦听器保存到一个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();


推荐阅读