【问题标题】:Dart resetting a field at midnight everydayDart 每天午夜重置字段
【发布时间】: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();
  }
}

【问题讨论】:

  • 你需要使用后台服务来做到这一点。

标签: flutter dart flutter-getx


【解决方案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 中。
    猜你喜欢
    • 2020-07-26
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2015-09-17
    • 2016-07-03
    • 1970-01-01
    相关资源
    最近更新 更多