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

Tos*_*kan 4 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') ?? '';
}
Run Code Online (Sandbox Code Playgroud)

使用反应式状态管理将状态存储到 GetXController 中的磁盘的最佳实践是什么?

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

    econtactnr.listen((x) {
      box.write('econtactnr', econtactnr.value);
    });
Run Code Online (Sandbox Code Playgroud)

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

Lor*_*n.A 9

GetX为此类功能提供了Workers 。ever方法可以监听并存储更新后的值,只要它发生变化。

在你的试试这个onInit

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

只要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);
      },
    );
  }
Run Code Online (Sandbox Code Playgroud)

然后使用worker.dispose();