Dart 每天午夜重置一个字段

时间:2021-06-02 14:51:29

标签: flutter dart getx flutter-getx

我想在每天午夜将 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();
  }
}

2 个答案:

答案 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());
  }
相关问题