Dart 每天午夜重置字段
Posted
技术标签:
【中文标题】Dart 每天午夜重置字段【英文标题】:Dart resetting a field at midnight everyday 【发布时间】:2021-06-02 14:51:29 【问题描述】:我想每天午夜将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();
【问题讨论】:
你需要使用后台服务来做到这一点。 【参考方案1】:尝试将您的dailyTasks
转换为Observable
类型,从int
到RxInt
,像这样,
class DataController with GetxController
@override
void onInit()
getDailyTask();
super.onInit();
var dailyTasks = 0.obs;
// DateTime
DateTime now = DateTime.now();
void dailyTaskIncrement()
dailyReads++;
dataBox.write('dailyTasks', dailyTasks.value);
update();
void getDailyTask()
dailyTasks = dataBox.read('dailyTasks');
if (now == 12)
dailyTasks = 0.obs;
update();
【讨论】:
【参考方案2】:你的问题是这里的逻辑:
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());
【讨论】:
问候 Loren,该值未重置。我已经更新了代码,请查看它。 您是否在您的onInit
中调用_storeAppStartupTime
?我在那里没看到。
是的 Loren,我在 onInit
方法中调用了 _storeAppStartupTime
和 getDailyTasks()
。数据会持续存在,但不会在午夜重置。
哎呀,我看到了我的错误。抱歉,我在将时间与现在进行比较之前就存储了时间。没有等到第二天就无法测试它。 dailyTasks
重置后需要存储启动时间。请参阅更新的答案。您可以完全删除 _storeAppStartupTime
并将其存储在 getDailyTasks
函数的末尾而不是 onInit
中。以上是关于Dart 每天午夜重置字段的主要内容,如果未能解决你的问题,请参考以下文章
Flutter/dart:Parse Server sdk:ParseUser.currentUser() 函数在重置时返回 null