flutter - 在颤动中将数据持久化/存储在 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);
});
问题:可以吗?我是否也必须取消该订阅?
解决方案
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();
推荐阅读
- node.js - 为什么我不能关闭 NSolid 进程?它像什么都没有吃资源
- nosql - CouchDB 是否需要与我的网站一起托管,还是我要将它作为我的网络或计算机上的本地服务器使用?
- authorize.net - Authorize.Net:使用 invoiceNumber 时出现“意外错误”
- mule - 使用 dwl 1.0 替换数组中的特定值
- sql - 每天在一个页面上花费的总时间
- python - 保存numpy数组时tmpfile有什么意义?
- python - 何时使用随机森林
- kubernetes - 当您在 Kubernetes 集群中耗尽节点时会发生什么?
- java - 从列表中替换或删除特殊字符
爪哇 - javascript - onsubmit 事件后警报不会停止 - javascript ajax