我有这个类并使用“反应式”状态管理,例如
"".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);
});
问题:可以吗?我是否也必须取消该订阅?
答案 0 :(得分:3)
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();
处理