我想在每天午夜将 dailyTasks
字段重置为 0
。我正在使用 Get Storage 插件保留该字段。数据正在持久化,但未重置。
代码如下:
class DataController with GetxController {
@override
void onInit() {
getDailyTask();
super.onInit();
}
int dailyTasks;
// DateTime
DateTime now = DateTime.now();
void dailyTaskIncrement() {
dailyReads++;
dataBox.write('dailyTasks', dailyTasks);
update();
}
void getDailyTask() {
dailyTasks = dataBox.read('dailyTasks');
if (now == 12) {
dailyTasks = 0;
}
update();
}
}
// For User Loren
int dailyTasks;
// DateTime
DateTime now = DateTime.now();
//
void dailyTasksIncrement() {
dailyTasks++;
dataBox.write('dailyTasks', dailyTasks);
update();
}
// Stores time to storage
void _storeAppStartupTime() => dataBox.write('startupTime', now.toString());
//
void getDailyTasks() {
final previousStartupTime = DateTime.parse(dataBox.read('startupTime'));
final nextMidnight = DateTime(
previousStartupTime.year,
previousStartupTime.month,
previousStartupTime.day + 1); // returns exactly the next midnight
if (now.isAfter(nextMidnight)) {
dailyTasks = dataBox.read('dailyTasks');
dailyTasks = 0;
} else {
dailyTasks = dataBox.read('dailyTasks');
dailyTasks == null ? dailyTasks = 0 : dailyTasks;
}
update();
}
}
答案 0 :(得分:0)
尝试将您的 dailyTasks
类型从 Observable
转换为 int
,如下所示,
RxInt
答案 1 :(得分:0)
你的问题是这里的逻辑:
if (now == 12) {
dailyTasks = 0;
}
now
是一个 DateTime
对象,您将它与 int
进行比较。因此,即使编译器出于某种原因让您逃脱惩罚,这永远不会是真的。
但是,即使您将其修复为
if (now.hour == 0) { // 0 is midnight
dailyTasks = 0;
}
只有当他们碰巧在凌晨 12 点到凌晨 1 点之间打开应用程序时才会重置。
您可以存储用户每次打开应用时的启动时间。
如果现在是在距离用户上次打开应用程序最接近的午夜之后,此函数现在将重置您的 dailyTask
。假设此控制器仅在用户启动应用程序时初始化一次,这应该有效。如果没有,请将启动时间存储在它只发生一次的地方,但在您运行此函数之后。由于该函数依赖于存储的用户上次打开应用程序的启动时间,因此在您重置 dailyTasks
后才能再次存储。
void getDailyTask() {
final previousStartupTime = DateTime.parse(dataBox.read('startup_time')) ?? DateTime.now();
final nextMidnight = DateTime(
previousStartupTime.year,
previousStartupTime.month,
previousStartupTime.day + 1); // returns exactly the next midnight
if (now.isAfter(nextMidnight)) {
dailyTasks = 0;
}
update();
dataBox.write('startup_time', now.toString());
}