在颤振中在 GetXController 中持久化/存储数据的正确方法

时间:2021-04-17 02:41:00

标签: flutter flutter-getx

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

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

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

1 个答案:

答案 0 :(得分:3)

GetX 为此类功能提供了 Workersever 方法可以在更新值发生变化时侦听并存储该值。

在您的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(); 处理