Правильный способ сохранения / хранения данных в 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);
    });

вопрос: это нормально? мне тоже нужно отменить эту подписку?


person Toskan    schedule 17.04.2021    source источник


Ответы (1)


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();

person Loren.A    schedule 28.04.2021
comment
ах, легко упустить из виду, поскольку я уверен, что большинство из них не ассоциирует worker с listener. Или нужно? - person Toskan; 28.04.2021
comment
Да, я бы так сказал. Это то, что делают Workers, слушают и предоставляют обратные вызовы при изменении значений. Как вы обнаружили, вы можете прослушивать поток GetX без рабочих, но для меня Workers обеспечиваю более приятный синтаксис и предлагаю несколько интересных служебных методов, когда вам нужен более точный контроль над тем, что и когда происходит. - person Loren.A; 28.04.2021