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 类型,从intRxInt,像这样,

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 方法中调用了 _storeAppStartupTimegetDailyTasks()。数据会持续存在,但不会在午夜重置。 哎呀,我看到了我的错误。抱歉,我在将时间与现在进行比较之前就存储了时间。没有等到第二天就无法测试它。 dailyTasks 重置后需要存储启动时间。请参阅更新的答案。您可以完全删除 _storeAppStartupTime 并将其存储在 getDailyTasks 函数的末尾而不是 onInit 中。

以上是关于Dart 每天午夜重置字段的主要内容,如果未能解决你的问题,请参考以下文章

显示从午夜到现在的计数器数据

Flutter/dart:Parse Server sdk:ParseUser.currentUser() 函数在重置时返回 null

每天通过youtube api发送视频的限制

如何每天重置应用程序变量

计算 Pandas 中每天重置的累积盘中指标

如何在Javascript中每24小时将变量重置为0?